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 une CancelledException est levée. Pour limiter l’attente dans le temps, vous pouvez utiliser Async\timeout().

Valeurs de retour

La prochaine valeur du canal (mixed).

Erreurs

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