Channel::recvAsync
(PHP 8.6+, True Async 1.0)
public Channel::recvAsync(): Future
Effectue une réception non bloquante d’une valeur du canal et retourne un objet Future
qui peut être attendu ultérieurement.
Contrairement à recv(), cette méthode ne suspend pas immédiatement la coroutine courante.
Au lieu de cela, un Future est retourné qui sera résolu lorsqu’une valeur deviendra disponible.
Valeurs de retour
Un objet Future qui sera résolu avec la valeur reçue du canal.
Exemples
Exemple #1 Réception non bloquante
<?php
use Async\Channel;
$channel = new Channel(3);
spawn(function() use ($channel) {
$channel->send('data A');
$channel->send('data B');
$channel->close();
});
spawn(function() use ($channel) {
$futureA = $channel->recvAsync();
$futureB = $channel->recvAsync();
// On peut effectuer d'autres tâches tant que les données ne sont pas encore nécessaires
doSomeWork();
echo await($futureA) . "\n"; // "data A"
echo await($futureB) . "\n"; // "data B"
});
Exemple #2 Réception parallèle depuis plusieurs canaux
<?php
use Async\Channel;
$orders = new Channel(10);
$notifications = new Channel(10);
spawn(function() use ($orders, $notifications) {
$orderFuture = $orders->recvAsync();
$notifFuture = $notifications->recvAsync();
// Attendre la première valeur disponible de n'importe quel canal
[$result, $index] = awaitAnyOf($orderFuture, $notifFuture);
echo "Reçu du canal #$index : $result\n";
});
Voir aussi
- Channel::recv — Réception bloquante
- Channel::sendAsync — Envoi non bloquant
- await — Attendre un Future