Koordinatör Bekleme Grubu WaitGroup
WaitGroup, Barrier ile benzerlik gösteren, asenkron görevlerde tüm koordinatörlerin tamamlanmasını beklemek için kullanılan bir senkronizasyon aracıdır.
Barrier'dan farkı, WaitGroup'un geliştiriciler tarafından sayının artırılıp azaltılmasını kontrol edebilmesidir.
Dikkat
Alt sistem, otomatik olarak sürücü türünü tanır, yalnızca Swoole/Swow/Fiber sürücülerini destekler.İpucu
Bu özellik workerman>=5.1.0 gerektirir.
<?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 Sunucusu
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // Ya da Swow::class veya 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 {
// Bir şey yap
} finally {
$wg->done();
}
});
}
// Tüm koordinatörlerin tamamlanmasını bekle, 10 saniye sonra zaman aşımına uğra
$result = $wg->wait(10.0);
if (!$result) {
$connection->send('WaitGroup Zaman Aşımı');
return;
}
$connection->send('Tüm Görevler Tamamlandı');
};
Worker::runAll();
Arayüz Açıklaması
interface WaitGroupInterface
{
/**
* Sayıyı artır
*
* @param int $delta
* @return bool
*/
public function add(int $delta = 1): bool;
/**
* Sayıyı tamamla
*
* @return bool
*/
public function done(): bool;
/**
* Sayıyı döndür
*
* @return int
*/
public function count(): int;
/**
* Koordinatör bekle
*
* @param int|float $timeout ikinci
* @return bool zaman aşımı:false başarı:true
*/
public function wait(int|float $timeout = -1): bool;
}