心美,一切皆美

人生的弓,拉得太满人会疲惫,拉得不满人会掉队,我们要学会张弛有度

Swoole 协程使用示例及协程优先级

示例一:

Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);

Corun(function () {
    go(function() {
        var_dump(file_get_contents("http://www.baidu.com/"));
    });

    go(function() {
        CoSystem::sleep(1);
        echo "donen";
    });
});
echo 1; //可以执行

示例二:

Corun(function () {
    $server = new CoHttpServer("127.0.0.1", 9502, false);
    $server->handle('/', function ($request, $response) {
        $response->end("<h1>Index</h1>");
    });
    $server->start();
});
echo 1; //不能执行

示例三:

Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);

go(function() {
  // 底层优先执行子协程的代码
  go(function () {
      // 子协程挂起,执行上层代码
      CoSystem::sleep(3.0);
      go(function () {
          CoSystem::sleep(2.0);
          echo "co[3] endn";
      });
      echo "co[2] endn";
  });

  // 协程挂起,但不需要切换
  CoSystem::sleep(1.0);
  echo "co[1] endn";
});

/*
co[1] end
co[2] end
co[3] end
*/

示例四:

Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]);

echo "main startn";

Corun(function () {
    echo "coro " . co::getcid() . " startn";
    
    // 创建并开始执行子协程
    go(function () {
        echo "coro " . co::getcid() . " startn";
        
        // 发生协程调度,回去执行外层协程
        CoSystem::sleep(.2);
        echo "coro " . co::getcid() . " endn";
    });
    
    echo "coro " . co::getcid() . " do not wait children coroutinen";
    
    // 发生协程调度,但子协程还没执行完,继续往下执行
    CoSystem::sleep(.1);
    echo "coro " . co::getcid() . " endn";
    // 外层协程执行完毕,回去执行子协程
});
echo "endn";

/*
main start
coro 1 start
coro 2 start
coro 1 do not wait children coroutine
coro 1 end
coro 2 end
end
*/
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注