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;
}