ComponentesThreadChannel::isFull()

ThreadChannel::isFull

(PHP 8.6+, True Async 1.0)

php
public ThreadChannel::isFull(): bool

Devuelve true si el buffer del canal ha alcanzado su capacidad máxima.

Para un canal sin buffer (capacity = 0), esto siempre devuelve true porque no hay buffer — cada send() debe esperar a un recv() correspondiente.

isFull() es seguro para hilos. El resultado refleja el estado en el momento de la llamada; otro hilo puede liberar un slot inmediatamente después.

Valores de retorno

true — el buffer está en su capacidad máxima (o es un canal sin buffer). false — el buffer tiene al menos un slot libre.

Ejemplos

Ejemplo #1 Comprobar si el buffer está lleno antes de enviar

php
<?php

use Async\ThreadChannel;

$channel = new ThreadChannel(3);

echo $channel->isFull() ? "lleno" : "tiene espacio"; // "tiene espacio"

$channel->send('x');
$channel->send('y');
$channel->send('z');

echo $channel->isFull() ? "lleno" : "tiene espacio"; // "lleno"

Ejemplo #2 Monitoreo de contrapresión en un hilo productor

php
<?php

use Async\ThreadChannel;
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;

spawn(function() {
    $channel = new ThreadChannel(10);

    $producer = spawn_thread(function() use ($channel) {
        $items = range(1, 30);
        foreach ($items as $item) {
            if ($channel->isFull()) {
                // El buffer está actualmente lleno — send() bloqueará;
                // registrar la contrapresión para observabilidad
                error_log("Contrapresión en ThreadChannel: buffer lleno");
            }
            $channel->send($item); // bloquea hasta que haya espacio disponible
        }
        $channel->close();
    });

    $consumer = spawn_thread(function() use ($channel) {
        try {
            while (true) {
                // Simular consumidor lento
                $val = $channel->recv();
                // procesar $val ...
            }
        } catch (\Async\ThreadChannelException) {
            echo "Hecho\n";
        }
    });

    await($producer);
    await($consumer);
});

Véase también