Swoole的Co\run與go()

go與Co\run()

使用 Coroutine::create 或 go 方法創建協程 (參考別名小節),在創建的協程中才能使用協程 API,而協程必須創建在協程容器裏面,參考協程容器

所有的協程必須在協程容器裏面創建Swoole 程序啓動的時候大部分情況會自動創建協程容器,用 Swoole 啓動程序的方式一共有三種:

  • 調用異步風格服務端程序(new Co\Http\Server)的 start 方法,此種啓動方式會在事件回調中創建協程容器,參考 enable_coroutine
  • 調用 Swoole 提供的 2 個進程管理模塊 Process 和 Process\Pool 的 start 方法,此種啓動方式會在進程啓動的時候創建協程容器,參考這兩個模塊構造函數的 enable_coroutine 參數。
  • 其他直接裸寫協程的方式啓動程序,需要先創建一個協程容器 (Co\run() 函數,可以理解爲 java、c 的 main 函數),例如:
echo "main start\n";
Co\run(function () {
    echo "coro ".co::getcid()." start\n";
    go(function () {
        echo "coro ".co::getcid()." start\n";
        co::sleep(.2);
        echo "coro ".co::getcid()." end\n";
    });
    echo "coro ".co::getcid()." do not wait children coroutine\n";
    co::sleep(.1);
    echo "coro ".co::getcid()." end\n";
});
echo "end\n";
/*
main start
coro 1 start
coro 2 start
coro 1 do not wait children coroutine
coro 1 end
coro 2 end
end
*/

channel

channel 可以理解爲消息隊列,只不過是協程間的消息隊列,多個協程通過 push 和 pop 操作生產消息和消費消息,用來協程之間的通訊。需要注意的是 channel 是沒法跨進程的,只能一個 Swoole 進程裏的協程間通訊,最典型的應用是連接池併發調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章