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