Channel::recv
(PHP 8.6+, True Async 1.0)
public Channel::recv(?Completable $cancellationToken = null): mixed
Reçoit la prochaine valeur du canal. C’est une opération bloquante — la coroutine courante est suspendue si aucune valeur n’est disponible dans le canal.
Si le canal est fermé et que le tampon est vide, une ChannelException est levée.
Si le canal est fermé mais que des valeurs restent dans le tampon, elles seront retournées.
Paramètres
- 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 uneCancelledExceptionest levée. Pour limiter l’attente dans le temps, vous pouvez utiliserAsync\timeout().
Valeurs de retour
La prochaine valeur du canal (mixed).
Erreurs
- Lève
Async\ChannelExceptionsi le canal est fermé et que le tampon est vide. - Lève
Async\CancelledExceptionsi le jeton d’annulation a été complété.
Exemples
Exemple #1 Réception de valeurs depuis un canal
<?php
use Async\Channel;
$channel = new Channel(5);
spawn(function() use ($channel) {
for ($i = 1; $i <= 5; $i++) {
$channel->send($i);
}
$channel->close();
});
spawn(function() use ($channel) {
try {
while (true) {
$value = $channel->recv();
echo "Reçu : $value\n";
}
} catch (\Async\ChannelException) {
echo "Canal fermé et vide\n";
}
});
Exemple #2 Réception avec délai d’attente
<?php
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$value = $channel->recv(Async\timeout(2000));
echo "Reçu : $value\n";
} catch (\Async\CancelledException) {
echo "Aucune donnée reçue dans les 2 secondes\n";
}
});
Exemple #3 Réception avec un jeton d’annulation personnalisé
<?php
use Async\Channel;
use Async\Future;
$channel = new Channel();
$cancel = new Future();
spawn(function() use ($channel, $cancel) {
try {
$value = $channel->recv($cancel);
echo "Reçu : $value\n";
} catch (\Async\CancelledException) {
echo "Réception annulée\n";
}
});
// Annuler depuis une autre coroutine
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});
Voir aussi
- Channel::recvAsync — Réception non bloquante
- Channel::send — Envoyer une valeur dans le canal
- Channel::isEmpty — Vérifier si le tampon est vide
- Channel::getIterator — Itérer sur le canal avec foreach