什么是協程
協程可以簡單理解為執行緒,只不過這個執行緒是用戶態的,不需要作業系統參與,創建、銷毀和切換的成本都非常低,
協程不能利用多核 cpu,想利用多核 cpu 需要依賴 Swoole 的多行程模型,
什么是通道
通道(channel )是協程間的訊息佇列,多個協程通過 push 操作生產訊息、通過 pop 操作消費訊息,通道用來作為協程之間的通訊,
通道不能跨行程,只能在一個 Swoole 行程里的協程間通訊,典型的應用是連接池和并發呼叫,
協程容器
協程容器是協程創建和運行的空間,在協程容器中創建的協程里面才能使用協程 API,
Swoole 程式啟動的時候大部分情況會自動創建 協程容器,用 Swoole 啟動程式的方式一共有三種:
- 呼叫異步風格服務端程式的 start 方法,此種啟動方式會在事件回呼中創建
協程容器, - 呼叫
Swoole提供的 2 個行程管理模塊 Process 和 Process\Pool 的 start 方法,此種啟動方式會在行程啟動的時候創建協程容器, - 其他直接裸寫協程的方式啟動程式,需要先使用
Co\run()函式創建一個協程容器,
創建協程
在創建了協程容器之后,我們就可以在容器中創建協程并呼叫協程API了,
創建協程的方法是: Swoole\Coroutine::create() ,別名 go() ,創建后的協程會立即執行,
協程調度
用戶的每個請求都會創建一個協程,請求結束后協程結束,如果同時有成千上萬的并發請求,某一時刻某個行程內部會存在成千上萬的協程,決定讓 CPU 執行哪個協程的代碼決斷程序就是協程調度,
- 首先,在執行某個協程代碼的程序中發現這行代碼遇到了
Co\System::sleep或者產生了網路IO,例如MySQL->query(),Swoole會把這個 Mysql 連接的 Fd 放到 EventLoop 中,- 然后讓出這個協程的 CPU 給其他協程使用:即 yield(掛起)
- 等待 MySQL 資料回傳后就繼續執行這個協程:即 resume(恢復)
- 其次,如果協程的代碼有 CPU 密集型代碼,可以開啟 enable_preemptive_scheduler,Swoole 會強行讓這個協程讓出 CPU,
協程注意事項
- 協程切換的前后不能保證全域變數以及
static變數的一致性, - 無法通過
$_GET/$_POST/$_REQUEST/$_SESSION/$_COOKIE/$_SERVER等$_開頭的變數獲取到任何屬性引數, Co\run()不能嵌套使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/6574.html
標籤:PHP
上一篇:JAVA 裝飾者模式
