Barrera de Corutinas
La Barrera es una herramienta para la sincronización de corutinas, que permite esperar a que todas las corutinas terminen su ejecución antes de continuar con la lógica posterior en tareas asíncronas. La Barrera está basada en el conteo de referencias de PHP.
Nota
El tipo de controlador se identifica automáticamente en el nivel inferior y solo es compatible con los controladores Swoole/Swow/Fiber.Sugerencia
Esta característica requiere 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';
// Servidor Http
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // O Swow::class o Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$barrier = Barrier::create();
for ($i=1; $i<5; $i++) {
Coroutine::create(function () use ($barrier, $i) {
// Hacer algo
});
}
// Esperar a que todas las corutinas terminen
Barrier::wait($barrier);
$connection->send('Todas las tareas completadas');
};
Worker::runAll();
Descripción de la Interfaz
interface BarrierInterface
{
/**
* Crear una nueva instancia de Barrier
*/
public static function create(): object;
/**
* Suspender la corutina actual, esperando a que todas las tareas de corutinas especificadas en el Barrier se completen
*/
public static function wait(object &$barrier, int $timeout = -1): void;
}