Channel canal de coroutine
Le canal est un mécanisme de communication entre les coroutines. Une coroutine peut pousser des données dans le canal, tandis qu'une autre coroutine peut en extraire des données, permettant ainsi la synchronisation et le partage de données entre les coroutines.
Astuce
Cette fonctionnalité nécessite workerman>=5.1.0
Attention
- Support automatique en arrière-plan pour Swoole/Swow/Fiber/Select/Event
- Lors de l'utilisation de Select/Event, les paramètres de timeout pour pop/push ne sont pas pris en charge.
<?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; // Ou Swow::class ou 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)); // Réponse : ["Task 1 Done","Task 2 Done"]
};
Worker::runAll();
Description de l'interface
interface ChannelInterface
{
/**
* Pousse des données dans le canal, prend en charge le timeout (en secondes), retours false en cas de timeout
*/
public function push(mixed $data, float $timeout = -1): bool;
/**
* Extrait des données du canal, prend en charge le timeout (timeout en secondes), retours false en cas de timeout
*/
public function pop(float $timeout = -1): mixed;
/**
* Obtient la longueur des données dans le canal
*/
public function length(): int;
/**
* Obtient la capacité du canal
*/
public function getCapacity(): int;
/**
* Vérifie s'il y a des consommateurs, c'est-à-dire s'il y a des coroutines en attente de pop des données
*/
public function hasConsumers(): bool;
/**
* Vérifie s'il y a des producteurs, c'est-à-dire s'il y a des coroutines en attente de push des données dans le canal
*/
public function hasProducers(): bool;
/**
* Ferme le canal
*/
public function close(): void;
}