Koroutine-Barriere Barrier
Barrier ist ein Tool zur Synchronisation von Koroutinen, das es ermöglicht, in asynchronen Aufgaben auf den Abschluss aller Koroutinen zu warten, bevor die nachfolgende Logik fortgesetzt wird. Barrier basiert auf der Referenzzählung von PHP.
Hinweis
Die zugrunde liegende Erkennung des Treibertyps erfolgt automatisch und unterstützt nur Swoole/Swow/Fiber-Treiber.Tipp
Diese Funktion erfordert workerman>=5.1.0.
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Barrier;
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) {
$barrier = Barrier::create();
for ($i=1; $i<5; $i++) {
Coroutine::create(function () use ($barrier, $i) {
// Mach etwas
});
}
// Warte, bis alle Koroutinen abgeschlossen sind
Barrier::wait($barrier);
$connection->send('Alle Aufgaben abgeschlossen');
};
Worker::runAll();
Schnittstellenerklärung
interface BarrierInterface
{
/**
* Erstellt eine neue Barrier-Instanz
*/
public static function create(): object;
/**
* Pausiert die aktuelle Koroutine und wartet, bis alle Koroutinenaufgaben in der angegebenen Barrier abgeschlossen sind
*/
public static function wait(object &$barrier, int $timeout = -1): void;
}