Nhóm chờ Go (WaitGroup)
WaitGroup tương tự như Barrier, là một công cụ đồng bộ cho các goroutine, cho phép chờ đợi tất cả các goroutine hoàn thành trước khi tiếp tục logic tiếp theo.
Sự khác biệt với Barrier là WaitGroup có thể được nhà phát triển tự kiểm soát việc tăng và giảm số đếm.
Lưu ý
Tự động nhận diện loại driver, chỉ hỗ trợ các driver Swoole/Swow/FiberGợi ý
Tính năng này cần 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; // Hoặc Swow::class hoặc Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
$wg = new WaitGroup();
for ($i=1; $i<5; $i++) {
$wg->add();
Coroutine::create(function () use ($wg, $i) {
try {
// Thực hiện một cái gì đó
} finally {
$wg->done();
}
});
}
// Chờ tất cả goroutine hoàn thành, thời gian chờ sau 10 giây
$result = $wg->wait(10.0);
if (!$result) {
$connection->send('WaitGroup Timeout');
return;
}
$connection->send('Tất cả nhiệm vụ đã hoàn thành');
};
Worker::runAll();
Giải thích giao diện
interface WaitGroupInterface
{
/**
* Tăng số đếm
*
* @param int $delta
* @return bool
*/
public function add(int $delta = 1): bool;
/**
* Hoàn thành số đếm
*
* @return bool
*/
public function done(): bool;
/**
* Trả về số đếm
*
* @return int
*/
public function count(): int;
/**
* Chờ goroutine
*
* @param int|float $timeout giây
* @return bool timeout:false success:true
*/
public function wait(int|float $timeout = -1): bool;
}