Swoole\Coroutine\WaitGroup用于协调多个协程执行完成,通过add()增加计数、done()减少计数、wait()阻塞等待计数归零,需确保add与done成对调用并在协程中使用try-finally保障done执行,避免死锁。
在 Swoole 中,Swoole\Coroutine\WaitGroup 用于等待一组协程全部执行完成,类似于 Go 语言中的 sync.WaitGroup。它通过计数机制来协调多个协程的结束时机。
Swo
ole\Coroutine\WaitGroup 的核心是三个方法:
下面是一个简单的例子,启动多个协程并等待它们全部完成:
use Swoole\Coroutine;
use Swoole\Coroutine\WaitGroup;
Coroutine\run(function () {
$wg = new WaitGroup();
$numTasks = 5;
for ($i = 0; $i < $numTasks; $i++) {
$wg->add(); // 每启动一个协程,计数加一
Coroutine::create(function () use ($wg, $i) {
echo "协程 {$i} 开始执行\n";
Co::sleep(1); // 模拟异步任务
echo "协程 {$i} 执行完成\n";
$wg->done(); // 任务完成,计数减一
});
}
$wg->wait(); // 等待所有协程完成
echo "所有协程已执行完毕\n";
});
使用 WaitGroup 时需要注意以下几点:
例如增强健壮性:
Coroutine::create(function () use ($wg, $i) {
try {
echo "协程 {$i} 开始处理\n";
Co::sleep(1);
echo "协程 {$i} 完成\n";
} finally {
$wg->done(); // 确保无论如何都会调用 done
}
});
基本上就这些,合理使用 Swoole\Coroutine\WaitGroup 能有效控制并发协程的生命周期。