ComposantsChannel::recv

Channel::recv ​

(PHP 8.6+, True Async 1.0)

php
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 AsyncCancellation 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 ​

  • Lève Async\ChannelException si le canal est fermé et que le tampon est vide.
  • Lève Async\AsyncCancellation si le jeton d'annulation a été complété.

Exemples ​

Exemple #1 Réception de valeurs depuis un canal ​

php
<?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
<?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\AsyncCancellation) {
        echo "Aucune donnée reçue dans les 2 secondes\n";
    }
});

Exemple #3 Réception avec un jeton d'annulation personnalisé ​

php
<?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\AsyncCancellation) {
        echo "Réception annulée\n";
    }
});

// Annuler depuis une autre coroutine
spawn(function() use ($cancel) {
    Async\delay(500);
    $cancel->complete(null);
});

Voir aussi ​