请问如何让coroutine(协程)分组执行(一组完了再执行下一组)?

编写代码的场景:在Laravel的Console模式下编写命令行任务,根据一些数据集的数量发起对应个数的协程向某远程服务器进行一些数据交换


比如一共有10个协程,我希望每执行3个就阻塞等待一下,都完成了再执行下面3个

测试代码:

$arr = [];
foreach(array_pad($arr, 11, 1) as $i => $id){
    go(function()use($i){
        echo "$i 开始\n";

        $client = new new \Swoole\Coroutine\Client(SWOOLE_SOCK_TCP);
        $client->connect(...);
        $client->send(...)
        ....

        echo "$i 完了\n";
    });
    if($i > 0 && !($i % 3)){
        \swoole_event::wait();
        echo "一组结束 $i\n";
    }
}

\swoole_event::wait();
echo "全部结束";

我以为\swoole_event::wait();一定会阻塞等待前面已经创建的cortoutine执行完毕才会往后执行,结果发现并不是,输出样本如下:

0 开始
1 开始
2 开始
3 开始
2 完了
0 完了
3 完了
1 完了
一组结束 3
4 开始
5 开始
6 开始
一组结束 6
7 开始
8 开始
9 开始
一组结束 9
10 开始
全部结束

看到第1组开始和完了

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进