Channel Koordinatör Kanalı

Channel, koordinatörler arasında iletişim için bir mekanizmadır. Bir koordinatör veriyi kanala itebilirken, diğer bir koordinatör bu veriyi kanaldan alabilir ve böylece koordinatörler arasında senkronizasyon ve veri paylaşımı sağlar.

İpucu
Bu özellik workerman>=5.1.0 gerektirir.

Dikkat

  • Alt yapı otomatik olarak Swoole/Swow/Fiber/Select/Event ile desteklenmektedir.
  • Select/Event sürücüsü kullanıldığında, pop/push için zaman aşımı parametreleri desteklenmez.
<?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 Sunucusu
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Veya Swow::class veya Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $channel = new Channel(2);
    Coroutine::create(function () use ($channel) {
        $channel->push('Görev 1 Tamamlandı');
    });
    Coroutine::create(function () use ($channel) {
        $channel->push('Görev 2 Tamamlandı');
    });
    $result = [];
    for ($i = 0; $i < 2; $i++) {
        $result[] = $channel->pop();
    }
    $connection->send(json_encode($result)); // Yanıt: ["Görev 1 Tamamlandı","Görev 2 Tamamlandı"]
};
Worker::runAll();

Arayüz Açıklaması

interface ChannelInterface
{
    /**
     * Veriyi kanala itmek için, zaman aşımını destekler (birim saniye), zaman aşımı false döner
     */
    public function push(mixed $data, float $timeout = -1): bool;

    /**
     * Kanaldan veri almak için, zaman aşımını destekler (zaman aşımı birim saniye), zaman aşımı false döner
     */
    public function pop(float $timeout = -1): mixed;

    /**
     * Kanalda verinin uzunluğunu alır
     */
    public function length(): int;

    /**
     * Kanalın kapasitesini alır
     */
    public function getCapacity(): int;

    /**
     * Tüketici var mı, yani verileri pop için bekleyen bir koordinatör var mı
     */
    public function hasConsumers(): bool;

    /**
     * Üretici var mı, yani verileri kanala itmek için bekleyen bir koordinatör var mı
     */
    public function hasProducers(): bool;

    /**
     * Kanali kapatır
     */
    public function close(): void;

}