مجموعة انتظار التعاون WaitGroup
WaitGroup مشابه لـ Barrier، فهو أداة تستخدم لمزامنة التعاون، مما يتيح الانتظار حتى يتم الانتهاء من جميع التعاونات قبل متابعة المنطق اللاحق في المهام غير المتزامنة.
على عكس Barrier، يمكن للمطور التحكم في زيادة أو نقص العد في WaitGroup.
注意
底层自动识别驱动类型,仅支持Swoole/Swow/Fiber驱动提示
此特性需要 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
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // أو Swow::class أو 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 {
// قم بشيء ما
} finally {
$wg->done();
}
});
}
// انتظر حتى تنتهي جميع التعاونات، مهلة بعد 10 ثوانٍ
$result = $wg->wait(10.0);
if (!$result) {
$connection->send('WaitGroup Timeout');
return;
}
$connection->send('All Task Done');
};
Worker::runAll();
واجهة الشرح
interface WaitGroupInterface
{
/**
* زيادة العد
*
* @param int $delta
* @return bool
*/
public function add(int $delta = 1): bool;
/**
* إنجاز العد
*
* @return bool
*/
public function done(): bool;
/**
* إرجاع العد
*
* @return int
*/
public function count(): int;
/**
* انتظار التعاون
*
* @param int|float $timeout ثانية
* @return bool timeout:false success:true
*/
public function wait(int|float $timeout = -1): bool;
}