Channel::send
(PHP 8.6+, True Async 1.0)
public Channel::send(mixed $value, ?Completable $cancellationToken = null): void
Invia un valore al canale. Questa e’ un’operazione bloccante — la coroutine corrente viene sospesa se il canale non puo’ accettare il valore immediatamente.
Per un canale rendezvous (capacity = 0), il mittente attende fino a quando un’altra coroutine chiama recv().
Per un canale bufferizzato, il mittente attende solo quando il buffer e’ pieno.
Parametri
- value
- Il valore da inviare. Puo’ essere di qualsiasi tipo.
- cancellationToken
- Token di cancellazione (
Completable) che consente di interrompere l’attesa in base a una condizione arbitraria.null— attesa senza limiti (predefinito). Quando il token viene completato, l’operazione viene interrotta e viene lanciata unaCancelledException. Per limitare il tempo di attesa si puo’ utilizzareAsync\timeout().
Errori
- Lancia
Async\ChannelExceptionse il canale e’ chiuso. - Lancia
Async\CancelledExceptionse il token di cancellazione e’ stato completato.
Esempi
Esempio #1 Invio di valori a un canale
<?php
use Async\Channel;
$channel = new Channel(1);
spawn(function() use ($channel) {
$channel->send('first'); // inserito nel buffer
$channel->send('second'); // attende che si liberi spazio
$channel->close();
});
spawn(function() use ($channel) {
echo $channel->recv() . "\n"; // "first"
echo $channel->recv() . "\n"; // "second"
});
Esempio #2 Invio con timeout
<?php
use Async\Channel;
$channel = new Channel(0); // rendezvous
spawn(function() use ($channel) {
try {
$channel->send('data', Async\timeout(1000));
} catch (\Async\CancelledException $e) {
echo "Timeout: nessuno ha accettato il valore entro 1 secondo\n";
}
});
Esempio #3 Invio con token di cancellazione personalizzato
<?php
use Async\Channel;
use Async\Future;
$channel = new Channel(0);
$cancel = new Future();
spawn(function() use ($channel, $cancel) {
try {
$channel->send('data', $cancel);
} catch (\Async\CancelledException $e) {
echo "Invio cancellato\n";
}
});
// Cancelliamo l'operazione da un'altra coroutine
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});
Vedi anche
- Channel::sendAsync — Invio non bloccante
- Channel::recv — Ricevi un valore dal canale
- Channel::isFull — Verifica se il buffer e’ pieno
- Channel::close — Chiudi il canale