[Sw] Swoole-4.2.9 可以嘗試愉快應用 Swoole 協程了
大家知道 Swoole 提供了方便於伺服器、網路程式設計的模式,簡化了多程序程式設計。
這直接讓 PHP 的執行很容易變成常駐記憶體的 Server 程式,執行效率上有了數倍的提升。
但是這一切還沒有讓人足夠興奮,直到協程的完整支援,也就是說,可以隨時隨地併發了。
swoole-4.2.9 及以上,完整支援了 Go + Chan + Defer 程式設計模式,給了我們在 PHP 上面不一樣的體驗。
(協程 Go+Chan+Defer:https://wiki.swoole.com/wiki/page/1019.html)
go :建立一個協程 chan :建立一個通道 defer :延遲任務,在協程退出時執行,先進後出
就下面是一段簡短的程式,來領略一下什麼是隨時隨的併發:
預設允許建立的最大協程數是 3000,超過會有提示,隨後迴圈 1w 次,
迴圈中使用 go 建立協程,這就建立了 1w 個協程,執行時佔用 350M 左右,CPU 5%左右。
[ 自動開啟協程,同步 IO 切換為非同步 IO ]
通過 `php --ri swoole` 檢視拓展的一些配置項,enable_coroutine 是預設開啟的。
下面這些回撥中會自動建立協程,不需要使用 Coroutine::create( ) 或者 go( ) 建立:
- onWorkerStart
- onConnect
- onOpen
- onReceive
- redis_onReceive
- onPacket
- onRequest
- onMessage
- onPipeMessage
- onClose
- tick/after 定時器
(enable_coroutine:https://wiki.swoole.com/wiki/page/949.html)
Swoole\Runtime::enableCoroutine( ) 作用是將 PHP 提供的 stream、sleep、pdo、mysqli、redis 等功能從同步阻塞切換為協程的非同步 IO。
這樣在 go( ) 中的一些函式不一定要使用協程客戶端了, 即可以用 sleep 替代 co::sleep( )。
Happy coding.
Link: https://www.cnblogs.com/farwish/p/10236757.html