swoole 協程介紹

從 4.0 版本開始 Swoole 提供了完整的協程(Coroutine)+ 通道(Channel)特性,帶來全新的 CSP 編程模型

擴展:CSP模型是上個世紀七十年代提出的,用於描述兩個獨立的併發實體通過共享的通訊 channel(管道)進行通信的併發模型。CSP中channel是第一類對象,它不關注發送消息的實體,而關注與發送消息時使用的channel。

作用:
  • 開發者可以無感知的用同步的代碼編寫方式達到異步 IO 的效果和性能,避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中導致代碼無法維護
  • 同時由於底層封裝了協程,所以對比傳統的 PHP 層協程框架,開發者不需要使用 yield 關鍵詞來標識一個協程 IO 操作,所以不再需要對yield 的語義進行深入理解以及對每一級的調用都修改爲 yield,這極大的提高了開發效率
  • 提供了各種類型完善的協程客戶端,可以滿足大部分開發者的需求。
什麼是協程

協程可以簡單理解爲線程,只不過這個線程是用戶態的,不需要操作系統參與,創建銷燬和切換的成本非常低,和線程不同的是協程沒法利用多核 cpu 的,想利用多核 cpu 需要依賴 Swoole 的多進程模型

擴展:進程和線程的區別

什麼是 channel

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

什麼是協程調度
  • 首先每個協程可以簡單的理解爲一個線程,大家知道多線程是爲了提高程序的併發,同樣的多協程也是爲了提高併發。
  • 用戶的每個請求都會創建一個協程,請求結束後協程結束,如果同時有成千上萬的併發請求,某一時刻某個進程內部會存在成千上萬的協程,那麼 CPU資源是有限的,到底執行哪個協程的代碼?
  • 決定到底讓 CPU 執行哪個協程的代碼決斷過程就是協程調度,Swoole 的調度策略又是怎麼樣的呢?
協程調度過程
  1. 在執行某個協程代碼的過程中發現這行代碼遇到了 Co::sleep() 或者產生了網絡 IO,例如 MySQL->query(),這肯定是一個耗時的過程,Swoole 就會把這個 Mysql 連接的 Fd 放到 EventLoop 中。

  2. 讓出這個協程的 CPU 給其他協程使用:即 yield(掛起)

  3. 等待 MySQL 數據返回後就繼續執行這個協程:即 resume(恢復)

  4. 如果協程的代碼有 CPU 密集型代碼,我們可以開啓 enable_preemptive_scheduler,Swoole
    會強行讓這個協程讓出 CPU。

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