Rào cản đồng bộ Coroutine
Rào cản (Barrier) là một công cụ được sử dụng để đồng bộ hóa các coroutine, cho phép chờ đợi tất cả các coroutine hoàn thành trước khi tiếp tục logic tiếp theo trong các tác vụ bất đồng bộ. Rào cản được thực hiện dựa trên tính toán tham chiếu của PHP.
Lưu ý
Tầng dưới tự động nhận diện loại driver, chỉ hỗ trợ Swoole/Swow/FiberGợi ý
Tính năng này yêu cầu 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';
// Máy chủ Http
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Hoặc Swow::class hoặc Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$barrier = Barrier::create();
for ($i=1; $i<5; $i++) {
Coroutine::create(function () use ($barrier, $i) {
// Thực hiện một cái gì đó
});
}
// Chờ tất cả các coroutine hoàn thành
Barrier::wait($barrier);
$connection->send('Tất cả nhiệm vụ đã hoàn thành');
};
Worker::runAll();
Giải thích giao diện
interface BarrierInterface
{
/**
* Tạo một instance Barrier mới
*/
public static function create(): object;
/**
* Tạm dừng coroutine hiện tại, chờ tất cả các nhiệm vụ coroutine trong Barrier đã chỉ định hoàn thành
*/
public static function wait(object &$barrier, int $timeout = -1): void;
}