Channel::__construct
(PHP 8.6+, True Async 1.0)
php
public Channel::__construct(int $capacity = 0, int $noProducerTimeout = 0, int $noConsumerTimeout = 0, bool $hardTimeouts = false)Crea un nuevo canal para pasar datos entre corrutinas.
Un canal es una primitiva de sincronización que permite a las corrutinas intercambiar datos de forma segura. El comportamiento del canal depende del parámetro $capacity:
capacity = 0— canal rendezvous (sin búfer). La operaciónsend()suspende al emisor hasta que otra corrutina llame arecv(). Esto garantiza la transferencia sincrónica de datos.capacity > 0— canal con búfer. La operaciónsend()no bloquea mientras haya espacio en el búfer. Cuando el búfer está lleno, el emisor se suspende hasta que haya espacio disponible.
Parámetros
capacity : La capacidad del búfer interno del canal. 0 — canal rendezvous (por defecto), send bloquea hasta que se reciba. Número positivo — tamaño del búfer.
Ejemplos
Ejemplo #1 Canal rendezvous (sin búfer)
php
<?php
use Async\Channel;
$channel = new Channel(); // capacity = 0
spawn(function() use ($channel) {
$channel->send('hello'); // se suspende hasta que alguien llame a recv()
echo "Enviado\n";
});
spawn(function() use ($channel) {
$value = $channel->recv(); // recibe 'hello', desbloquea al emisor
echo "Recibido: $value\n";
});Ejemplo #2 Canal con búfer
php
<?php
use Async\Channel;
$channel = new Channel(3); // búfer para 3 elementos
spawn(function() use ($channel) {
$channel->send(1); // no bloquea — el búfer está vacío
$channel->send(2); // no bloquea — hay espacio disponible
$channel->send(3); // no bloquea — última posición
$channel->send(4); // se suspende — el búfer está lleno
});Ver también
- Channel::send — Enviar un valor al canal
- Channel::recv — Recibir un valor del canal
- Channel::capacity — Obtener la capacidad del canal
- Channel::close — Cerrar el canal