账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    请问如何让coroutine(协程)分组执行(一组完了再执行下一组)?
    • 2019-05-13 00:00
    • 11
    43
    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组开始和完了

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部