Channel::recvAsync
(PHP 8.6+, True Async 1.0)
public Channel::recvAsync(): Future
Esegue una ricezione non bloccante di un valore dal canale e restituisce un oggetto Future
che puo’ essere atteso successivamente.
A differenza di recv(), questo metodo non sospende immediatamente la coroutine corrente.
Viene invece restituito un Future che sara’ risolto quando un valore diventera’ disponibile.
Valori di ritorno
Un oggetto Future che verra’ risolto con il valore ricevuto dal canale.
Esempi
Esempio #1 Ricezione non bloccante
<?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();
// Puo' eseguire altro lavoro mentre i dati non sono ancora necessari
doSomeWork();
echo await($futureA) . "\n"; // "data A"
echo await($futureB) . "\n"; // "data B"
});
Esempio #2 Ricezione parallela da canali multipli
<?php
use Async\Channel;
$orders = new Channel(10);
$notifications = new Channel(10);
spawn(function() use ($orders, $notifications) {
$orderFuture = $orders->recvAsync();
$notifFuture = $notifications->recvAsync();
// Attende il primo valore disponibile da qualsiasi canale
[$result, $index] = awaitAnyOf($orderFuture, $notifFuture);
echo "Ricevuto dal canale #$index: $result\n";
});
Vedi anche
- Channel::recv — Ricezione bloccante
- Channel::sendAsync — Invio non bloccante
- await — Attende un Future