Canal de Corutinas

El Canal es un mecanismo de comunicación entre corutinas. Una corutina puede enviar datos al canal, mientras que otra corutina puede extraer datos de este, logrando así la sincronización y el intercambio de datos entre corutinas.

Consejo
Esta característica requiere workerman>=5.1.0

Nota

  • Soporte automático subyacente para Swoole/Swow/Fiber/Select/Event
  • Cuando se usa el controlador Select/Event, no admite parámetros de tiempo de espera para pop/push
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Channel;
use Workerman\Coroutine;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

// Servidor Http
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // O Swow::class o Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $channel = new Channel(2);
    Coroutine::create(function () use ($channel) {
        $channel->push('Tarea 1 Completada');
    });
    Coroutine::create(function () use ($channel) {
        $channel->push('Tarea 2 Completada');
    });
    $result = [];
    for ($i = 0; $i < 2; $i++) {
        $result[] = $channel->pop();
    }
    $connection->send(json_encode($result)); // Respuesta: ["Tarea 1 Completada","Tarea 2 Completada"]
};
Worker::runAll();

Descripción de la Interfaz

interface ChannelInterface
{
    /**
     * Envía datos al canal, admite tiempo de espera (en segundos), devuelve false si hay tiempo de espera
     */
    public function push(mixed $data, float $timeout = -1): bool;

    /**
     * Extrae datos del canal, admite tiempo de espera (el tiempo de espera en segundos), devuelve false si hay tiempo de espera
     */
    public function pop(float $timeout = -1): mixed;

    /**
     * Obtiene la longitud de los datos en el canal
     */
    public function length(): int;

    /**
     * Obtiene la capacidad del canal
     */
    public function getCapacity(): int;

    /**
     * Comprueba si hay consumidores, es decir, si hay corutinas esperando para extraer datos
     */
    public function hasConsumers(): bool;

    /**
     * Comprueba si hay productores, es decir, si hay corutinas esperando para enviar datos al canal
     */
    public function hasProducers(): bool;

    /**
     * Cierra el canal
     */
    public function close(): void;

}