1. 程式人生 > >[Sw] Swoole-4.2.9 可以嘗試愉快應用 Swoole 協程了

[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