1.swoole 的進程模型
swoole是一個多進程模型的框架,當啟動一個進程swoole應用時,一共會創建2+n+m個線程,n為worker進程數,m為TaskWorker進程數,1個master進程和一個manager進程,關系如下圖所示
Master進程為主進程,該進程會創建Manager進程、Reactor線程等工作進/線程
其中三種進程之間的關系是:
Reactor線程:
- 負責維護客戶端
TCP
連接、處理網絡IO
、處理協議、收發數據 - 完全是異步非阻塞的模式
- 全部為
C
代碼,除Start
/Shudown
事件回調外,不執行任何PHP代碼 - 將
TCP
客戶端發來的數據緩沖、拼接、拆分成完整的一個請求數據包 Reactor
以多線程的方式運行
Worker進程
- 接受由
Reactor
線程投遞的請求數據包,並執行PHP
回調函數處理數據 - 生成響應數據並發給
Reactor
線程,由Reactor
線程發送給TCP
客戶端 - 可以是異步非阻塞模式,也可以是同步阻塞模式
Worker
以多進程的方式運行
TaskWorker進程
- 接受由
Worker
進程通過swoole_server->task/taskwait
方法投遞的任務 - 處理任務,並將結果數據返回(使用
swoole_server->finish
)給Worker
進程 - 完全是同步阻塞模式
TaskWorker
以多進程的方式運行
2.swoole代碼
開啟taskworker需要配置task_worker_num,task_worker的數量
$this->serv->set(['worker_num'=>4,'task_worker_num'=>4,'daemonize'=>false]);
還需要實現回調方法,onTask,onFinish
$this->serv->on('Task',[$this,'onTask']); $this->serv->on('Finish',[$this,'onFinish']);