Channel::recvAsync

(PHP 8.6+, True Async 1.0)

public Channel::recvAsync(): Future

Realiza una recepción no bloqueante de un valor del canal y devuelve un objeto Future que puede ser esperado posteriormente.

A diferencia de recv(), este método no suspende la corrutina actual inmediatamente. En su lugar, se devuelve un Future que se resolverá cuando un valor esté disponible.

Valores de retorno

Un objeto Future que se resolverá con el valor recibido del canal.

Ejemplos

Ejemplo #1 Recepción no bloqueante

<?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();

    // Puede realizar otro trabajo mientras los datos no son necesarios aún
    doSomeWork();

    echo await($futureA) . "\n"; // "data A"
    echo await($futureB) . "\n"; // "data B"
});

Ejemplo #2 Recepción paralela de múltiples canales

<?php

use Async\Channel;

$orders = new Channel(10);
$notifications = new Channel(10);

spawn(function() use ($orders, $notifications) {
    $orderFuture = $orders->recvAsync();
    $notifFuture = $notifications->recvAsync();

    // Esperar el primer valor disponible de cualquier canal
    [$result, $index] = awaitAnyOf($orderFuture, $notifFuture);

    echo "Recibido del canal #$index: $result\n";
});

Ver también