0

编写代码的场景:在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组开始和完了

2019-05-13 提问
0 个回答

撰写答案

推广链接