Channel::recv

(PHP 8.6+, True Async 1.0)

public Channel::recv(?Completable $cancellationToken = null): mixed

Riceve il prossimo valore dal canale. Questa e’ un’operazione bloccante — la coroutine corrente viene sospesa se non ci sono valori disponibili nel canale.

Se il canale e’ chiuso e il buffer e’ vuoto, viene lanciata una ChannelException. Se il canale e’ chiuso ma ci sono ancora valori nel buffer, questi verranno restituiti.

Parametri

cancellationToken
Token di cancellazione (Completable) che consente di interrompere l’attesa in base a una condizione arbitraria. null — attesa senza limiti (predefinito). Quando il token viene completato, l’operazione viene interrotta e viene lanciata una CancelledException. Per limitare il tempo di attesa si puo’ utilizzare Async\timeout().

Valori di ritorno

Il prossimo valore dal canale (mixed).

Errori

Esempi

Esempio #1 Ricezione di valori da un canale

<?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 "Ricevuto: $value\n";
        }
    } catch (\Async\ChannelException) {
        echo "Canale chiuso e vuoto\n";
    }
});

Esempio #2 Ricezione con timeout

<?php

use Async\Channel;

$channel = new Channel();

spawn(function() use ($channel) {
    try {
        $value = $channel->recv(Async\timeout(2000));
        echo "Ricevuto: $value\n";
    } catch (\Async\CancelledException) {
        echo "Nessun dato ricevuto entro 2 secondi\n";
    }
});

Esempio #3 Ricezione con token di cancellazione personalizzato

<?php

use Async\Channel;
use Async\Future;

$channel = new Channel();
$cancel = new Future();

spawn(function() use ($channel, $cancel) {
    try {
        $value = $channel->recv($cancel);
        echo "Ricevuto: $value\n";
    } catch (\Async\CancelledException) {
        echo "Ricezione cancellata\n";
    }
});

// Cancelliamo da un'altra coroutine
spawn(function() use ($cancel) {
    Async\delay(500);
    $cancel->complete(null);
});

Vedi anche