[Sw] Swoole-4.2.9 能夠嘗試愉快應用 Swoole 協程

 

你們知道 Swoole 提供了方便於服務器、網絡編程的模式,簡化了多進程編程。php

這直接讓 PHP 的運行很容易變成常駐內存的 Server 程序,執行效率上有了數倍的提高。html

可是這一切尚未讓人足夠興奮,直到協程的完整支持,也就是說,能夠隨時隨地併發了。mysql

swoole-4.2.9 及以上,完整支持了 Go + Chan + Defer 編程模式,給了咱們在 PHP 上面不同的體驗。redis

(協程 Go+Chan+Defer:https://wiki.swoole.com/wiki/page/1019.html) sql

go :建立一個協程
chan :建立一個通道
defer :延遲任務,在協程退出時執行,先進後出

 

就下面是一段簡短的程序,來領略一下什麼是隨時隨的併發:編程

默認容許建立的最大協程數是 3000,超過會有提示,隨後循環 1w 次,服務器

循環中使用 go 建立協程,這就建立了 1w 個協程,運行時佔用 350M 左右,CPU 5%左右。swoole

 

[ 自動開啓協程,同步 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( ) 、PDO 代替 Coroutine\MySQL。

(Runtime:https://wiki.swoole.com/wiki/page/965.html

 

若是想要順利的使用協程編程,咱們可能還須要 WaitGroup 功能,將極大方便 Swoole 協程編程。

 

- 擴充資料 -

協程編程須知:https://wiki.swoole.com/wiki/page/851.html

協程併發調用:https://wiki.swoole.com/wiki/page/p-coroutine_multi_call.html

MySQL鏈接池與斷線重連:https://wiki.swoole.com/wiki/page/350.html

 

Happy coding.

Link: http://www.javashuo.com/article/p-eptgcgbu-x.html

相關文章
相關標籤/搜索