Channel::recv
(PHP 8.6+, True Async 1.0)
public Channel::recv(?Completable $cancellationToken = null): mixed
Recibe el siguiente valor del canal. Esta es una operación bloqueante — la corrutina actual se suspende si no hay valores disponibles en el canal.
Si el canal está cerrado y el búfer está vacío, se lanza una ChannelException.
Si el canal está cerrado pero quedan valores en el búfer, se devolverán.
Parámetros
- cancellationToken
- Token de cancelación (
Completable) que permite interrumpir la espera según una condición arbitraria.null— espera sin límite (por defecto). Cuando el token se completa, la operación se interrumpe y se lanza unaCancelledException. Para limitar el tiempo de espera se puede utilizarAsync\timeout().
Valores de retorno
El siguiente valor del canal (mixed).
Errores
- Lanza
Async\ChannelExceptionsi el canal está cerrado y el búfer está vacío. - Lanza
Async\CancelledExceptionsi el token de cancelación fue completado.
Ejemplos
Ejemplo #1 Recepción de valores de 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 "Recibido: $value\n";
}
} catch (\Async\ChannelException) {
echo "Canal cerrado y vacío\n";
}
});
Ejemplo #2 Recepción con tiempo de espera
<?php
use Async\Channel;
$channel = new Channel();
spawn(function() use ($channel) {
try {
$value = $channel->recv(Async\timeout(2000));
echo "Recibido: $value\n";
} catch (\Async\CancelledException) {
echo "No se recibieron datos en 2 segundos\n";
}
});
Ejemplo #3 Recepción con token de cancelación personalizado
<?php
use Async\Channel;
use Async\Future;
$channel = new Channel();
$cancel = new Future();
spawn(function() use ($channel, $cancel) {
try {
$value = $channel->recv($cancel);
echo "Recibido: $value\n";
} catch (\Async\CancelledException) {
echo "Recepción cancelada\n";
}
});
// Cancelar desde otra corrutina
spawn(function() use ($cancel) {
Async\delay(500);
$cancel->complete(null);
});
Ver también
- Channel::recvAsync — Recepción no bloqueante
- Channel::send — Enviar un valor al canal
- Channel::isEmpty — Verificar si el búfer está vacío
- Channel::getIterator — Iterar sobre el canal usando foreach