[學習篇] Swoole 協程

Polaris發表於2020-01-03

什麼是程式?

程式就是應用程式的啟動例項。獨立的檔案資源,資料資源,記憶體空間。

什麼是執行緒?

執行緒屬於程式,是程式的執行者。一個程式至少包含一個主執行緒,也可以有更多的子執行緒。執行緒有兩種排程策略,一是:分時排程,二是:搶佔式排程。

什麼是協程?

協程是輕量級執行緒, 協程也是屬於執行緒,協程是線上程裡執行的。協程的排程是使用者手動切換的,所以又叫使用者空間執行緒。協程的建立、切換、掛起、銷燬全部為記憶體操作,消耗是非常低的。協程的排程策略是:協作式排程。

Swoole協程的原理

  1. Swoole4由於是單執行緒多程式的,同一時間同一個程式只會有一個協程在執行。

  2. Swoole server 接收資料在worker程式觸發onReceive回撥,產生一個攜程。Swoole為每個請求建立對應攜程。協程中也能建立子協程。

  3. 協程在底層實現上是單執行緒的,因此同一時間只有一個協程在工作,協程的執行是序列的。

  4. 因此多工多協程執行時,一個協程正在執行時,其他協程會停止工作。當前協程執行阻塞IO操作時會掛起,底層排程器會進入事件迴圈。當有IO完成事件時,底層排程器恢復事件對應的協程的執行。。所以協程不存在IO耗時,非常適合高併發IO場景。(如下圖)

Swoole的協程執行流程

  • 協程沒有IO等待 正常執行PHP程式碼,不會產生執行流程切換

  • 協程遇到IO等待 立即將控制權切,待IO完成後,重新將執行流切回原來協程切出的點

  • 協程並行協程依次執行,同上一個邏輯

  • 協程巢狀執行流程由外向內逐層進入,直到發生IO,然後切到外層協程,父協程不會等待子協程結束

GO語言協程

  • Go語言原生層面就支援協層,不需要宣告協程環境。(swoole非協程環境不能使用協程)

  • Go 協程是基於多執行緒的,可以利用多核 CPU,同一時間可能會有多個協程在執行

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章