什麼是程式?
程式就是應用程式的啟動例項。獨立的檔案資源,資料資源,記憶體空間。
什麼是執行緒?
執行緒屬於程式,是程式的執行者。一個程式至少包含一個主執行緒,也可以有更多的子執行緒。執行緒有兩種排程策略,一是:分時排程,二是:搶佔式排程。
什麼是協程?
協程是輕量級執行緒, 協程也是屬於執行緒,協程是線上程裡執行的。協程的排程是使用者手動切換的,所以又叫使用者空間執行緒。協程的建立、切換、掛起、銷燬全部為記憶體操作,消耗是非常低的。協程的排程策略是:協作式排程。
Swoole協程的原理
-
Swoole4由於是單執行緒多程式的,同一時間同一個程式只會有一個協程在執行。
-
Swoole server 接收資料在worker程式觸發onReceive回撥,產生一個攜程。Swoole為每個請求建立對應攜程。協程中也能建立子協程。
-
協程在底層實現上是單執行緒的,因此同一時間只有一個協程在工作,協程的執行是序列的。
-
因此多工多協程執行時,一個協程正在執行時,其他協程會停止工作。當前協程執行阻塞IO操作時會掛起,底層排程器會進入事件迴圈。當有IO完成事件時,底層排程器恢復事件對應的協程的執行。。所以協程不存在IO耗時,非常適合高併發IO場景。(如下圖)
Swoole的協程執行流程
-
協程沒有IO等待 正常執行PHP程式碼,不會產生執行流程切換
-
協程遇到IO等待 立即將控制權切,待IO完成後,重新將執行流切回原來協程切出的點
-
協程並行協程依次執行,同上一個邏輯
-
協程巢狀執行流程由外向內逐層進入,直到發生IO,然後切到外層協程,父協程不會等待子協程結束
GO語言協程
-
Go語言原生層面就支援協層,不需要宣告協程環境。(swoole非協程環境不能使用協程)
-
Go 協程是基於多執行緒的,可以利用多核 CPU,同一時間可能會有多個協程在執行
本作品採用《CC 協議》,轉載必須註明作者和本文連結