Channel Koroutine Kanal
Channel ist ein Mechanismus zur Kommunikation zwischen Koroutinen. Eine Koroutine kann Daten in den Kanal schieben, während eine andere Koroutine Daten daraus herauspoppen kann, um Synchronisation und Datenaustausch zwischen Koroutinen zu ermöglichen.
Hinweis
Diese Funktion benötigt workerman>=5.1.0
Achtung
- Automatische Unterstützung für Swoole/Swow/Fiber/Select/Event-Driven
- Bei Verwendung von Select/Event-Driven werden die Timeout-Parameter für pop/push nicht unterstützt
<?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 Server
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Oder Swow::class oder Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$channel = new Channel(2);
Coroutine::create(function () use ($channel) {
$channel->push('Aufgabe 1 Erledigt');
});
Coroutine::create(function () use ($channel) {
$channel->push('Aufgabe 2 Erledigt');
});
$result = [];
for ($i = 0; $i < 2; $i++) {
$result[] = $channel->pop();
}
$connection->send(json_encode($result)); // Antwort: ["Aufgabe 1 Erledigt","Aufgabe 2 Erledigt"]
};
Worker::runAll();
Schnittstellenerklärung
interface ChannelInterface
{
/**
* Schiebt Daten in den Kanal, unterstützt Timeout (Einheit Sekunden), gibt false bei Timeout zurück
*/
public function push(mixed $data, float $timeout = -1): bool;
/**
* Popt Daten aus dem Kanal, unterstützt Timeout (Timeout in Sekunden), gibt false bei Timeout zurück
*/
public function pop(float $timeout = -1): mixed;
/**
* Gibt die Länge der Daten im Kanal zurück
*/
public function length(): int;
/**
* Gibt die Kapazität des Kanals zurück
*/
public function getCapacity(): int;
/**
* Gibt zurück, ob es Verbraucher gibt, d.h. ob es Koroutinen gibt, die auf pop-Daten warten
*/
public function hasConsumers(): bool;
/**
* Gibt zurück, ob es Produzenten gibt, d.h. ob es Koroutinen gibt, die darauf warten, Daten in den Kanal zu pushen
*/
public function hasProducers(): bool;
/**
* Schließt den Kanal
*/
public function close(): void;
}