# Task Worker
---
<!-- toc -->
## 簡介
Task Worker是Swoole中一種特殊的工作進程,該進程的作用是處理一些耗時較長的任務,以達到釋放Worker進程的目的。Worker進程可以通過`swoole_server`對象的task方法投遞一個任務到Task Worker進程,其流程如下所示:
<!-- {% sequence %}
Worker->Task Worker: task()
Note right of Task Worker: onTask()
Task Worker->Worker: finish()
Note left of Worker: onFinish()
{% endsequence %} -->
Worker進程通過Unix Sock管道將數據發送給Task Worker,這樣Worker進程就可以繼續處理新的邏輯,無需等待耗時任務的執行。需要注意的是,由于Task Worker是獨立進程,因此無法直接在兩個進程之間共享全局變量,需要使用Redis、MySQL或者swoole_table來實現進程間共享數據。
## 實例
要使用Task Worker,需要進行一些必要的操作。
首先,需要設置swoole_server的配置參數:
```php
$serv->set(array(
'task_worker_num' => 2, // 設置啟動2個task進程
));
```
接著,綁定必要的回調函數:
```php
$serv->on('Task', 'onTask');
$serv->on('Finish','onFinish');
```
其中兩個回調函數的原型如下所示:
```php
/**
* @param $serv swoole_server swoole_server對象
* @param $task_id int 任務id
* @param $from_id int 投遞任務的worker_id
* @param $data string 投遞的數據
*/
function onTask(swoole_server $serv, $task_id, $from_id, $data);
/**
* @param $serv swoole_server swoole_server對象
* @param $task_id int 任務id
* @param $data string 任務返回的數據
*/
function onFinish(swoole_server $serv, $task_id, $data);
```
在實際邏輯中,當需要發起一個任務請求時,可以使用如下方法調用:
```php
$data = "task data";
$serv->task($data , -1 ); // -1代表不指定task進程
// 在1.8.6+的版本中,可以動態指定onFinish函數
$serv->task($data, -1, function (swoole_server $serv, $task_id, $data) {
echo "Task Finish Callback\n";
});
```
- 序章
- 1 環境搭建
- 1.1 環境搭建
- 1.2 搭建Echo服務器
- 2 初識Swoole
- 2.1 Worker進程
- 2.2 TaskWorker進程
- 2.3 Timer定時器
- 2.4 Process進程
- 2.5 Table內存表
- 2.6 多端口監聽
- 2.7 sendfile文件支持
- 2.8 SSL支持
- 3 Swoole協議
- 3.1 EOF協議
- 3.2 固定包頭協議
- 3.3 Http協議
- 3.4 WebSocket協議
- 3.5 MTQQ協議
- 4 Swoole客戶端
- 4.1 Client
- 4.2 異步Http客戶端
- 4.3 異步WebSocket客戶端
- 4.4 異步MySQL客戶端
- 4.5 異步Redis客戶端
- 5 Swoole異步IO
- 5.1 AsyncIO
- 5.2 EventLoop
- 6 Swoole使用
- 7 框架應用
- 7.1 ZPHP
- 7.2 TSF
- 7.3 Hprose
- 7.4 Dora-rpc
- 8 已有框架支持
- 8.1 Yaf
- 8.2 Phalcon
- 8.3 Thinkphp
- 9 項目實戰
- 附錄*配置選項
- 附錄*回調函數
- 附錄*屬性列表
- 附錄*函數列表