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
進程裏的協程間通訊,最典型的應用是連接池和併發調用。