Channel::send
(PHP 8.6+, True Async 1.0)
public Channel::send(mixed $value, ?Completable $cancellationToken = null): voidEnvoie une valeur dans le canal. C'est une opération bloquante — la coroutine courante est suspendue si le canal ne peut pas accepter la valeur immédiatement.
Pour un canal rendez-vous (capacity = 0), l'expéditeur attend qu'une autre coroutine appelle recv(). Pour un canal avec tampon, l'expéditeur attend uniquement lorsque le tampon est plein.
Paramètres
value : La valeur à envoyer. Peut être de n'importe quel type.
cancellationToken : Jeton d'annulation (Completable) permettant d'interrompre l'attente selon une condition arbitraire. null — attente sans limite (par défaut). Lorsque le jeton est complété, l'opération est interrompue et une AsyncCancellation est levée. Pour limiter l'attente dans le temps, vous pouvez utiliser Async\timeout().
Erreurs
- Lève
Async\ChannelExceptionsi le canal est fermé. - Lève
Async\AsyncCancellationsi le jeton d'annulation a été complété.
Exemples
Exemple #1 Envoi de valeurs dans un canal
<?php
use Async\Channel;
$channel = new Channel(1);
spawn(function() use ($channel) {
$channel->send('first'); // placé dans le tampon
$channel->send('second'); // attend qu'un emplacement se libère
$channel->close();
});
spawn(function() use ($channel) {
echo $channel->recv() . "\n"; // "first"
echo $channel->recv() . "\n"; // "second"
});Exemple #2 Envoi avec délai d'attente
<?php
use Async\Channel;
$channel = new Channel(0); // rendez-vous
spawn(function() use ($channel) {
try {
$channel->send('data', Async\timeout(1000));
} catch (\Async\AsyncCancellation $e) {
echo "Délai dépassé : personne n'a accepté la valeur en 1 seconde\n";
}
});Exemple #3 Envoi avec un jeton d'annulation personnalisé
<?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\AsyncCancellation $e) {
echo "Envoi annulé\n";
}
});
// Annuler l'opération depuis une autre coroutine
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});Voir aussi
- Channel::sendAsync — Envoi non bloquant
- Channel::recv — Recevoir une valeur du canal
- Channel::isFull — Vérifier si le tampon est plein
- Channel::close — Fermer le canal