Channel コルーチンチャネル

Channel はコルーチン間の通信のためのメカニズムです。一つのコルーチンがチャネルにデータをプッシュし、別のコルーチンがそこからデータをポップすることで、コルーチン間の同期とデータ共有を実現します。

ヒント
この機能は workerman>=5.1.0 を必要とします。

注意

  • 基盤自動で Swoole/Swow/Fiber/Select/Event ドライバをサポートします。
  • Select/Event ドライバ使用時、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';

// Http サーバー
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // または Swow::class または Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $channel = new Channel(2);
    Coroutine::create(function () use ($channel) {
        $channel->push('Task 1 Done');
    });
    Coroutine::create(function () use ($channel) {
        $channel->push('Task 2 Done');
    });
    $result = [];
    for ($i = 0; $i < 2; $i++) {
        $result[] = $channel->pop();
    }
    $connection->send(json_encode($result)); // 応答: ["Task 1 Done","Task 2 Done"]
};
Worker::runAll();

インターフェース説明

interface ChannelInterface
{
    /**
     * データをチャネルにプッシュします。タイムアウトをサポート (単位は秒)、タイムアウト時は false を返します。
     */
    public function push(mixed $data, float $timeout = -1): bool;

    /**
     * チャネルからデータをポップします。タイムアウトをサポート (タイムアウト単位は秒)、タイムアウト時は false を返します。
     */
    public function pop(float $timeout = -1): mixed;

    /**
     * チャネル内のデータの長さを取得します。
     */
    public function length(): int;

    /**
     * チャネルの容量を取得します。
     */
    public function getCapacity(): int;

    /**
     * 消費者がいるかどうか、つまりデータのポップを待っているコルーチンがいるかどうかを確認します。
     */
    public function hasConsumers(): bool;

    /**
     * プロデューサーがいるかどうか、つまりデータをチャネルにプッシュを待っているコルーチンがいるかどうかを確認します。
     */
    public function hasProducers(): bool;

    /**
     * チャネルを閉じます。
     */
    public function close(): void;

}