task_ipc_mode
最后更新于:2022-04-02 06:21:42
# task\_ipc\_mode
[TOC]
设置`Task`进程与`Worker`进程之间通信的方式。
* 1, 使用`Unix Socket`通信,默认模式
* 2, 使用消息队列通信
* 3, 使用消息队列通信,并设置为争抢模式
## 模式1
使用模式`1`时,支持定向投递,可在`task`和`taskwait`方法中使用`dst_worker_id`,制定目标`Task`进程。
`dst_worker_id`设置为`-1`时,底层会判断每个`Task`进程的状态,向当前状态为空闲的进程投递任务。
## 消息队列模式
模式`2`和模式`3`使用`sysvmsg`消息队列通信。
* 消息队列模式使用操作系统提供的内存队列存储数据,未指定[mssage\_queue\_key](message\_queue\_key.md)消息队列`Key`,将使用私有队列,在`Server`程序终止后会删除消息队列。
* 指定消息队列`Key`后`Server`程序终止后,消息队列中的数据不会删除,因此进程重启后仍然能取到数据
* 可使用`ipcrm -q 消息队列ID`手工删除消息队列数据
模式`2`和模式`3`的不同之处是,模式`2`支持定向投递,`$serv->task($data, $task_worker_id)`可以指定投递到哪个`task`进程。模式`3`是完全争抢模式,`task`进程会争抢队列,将无法使用定向投递,`task`/`taskwait`将无法指定目标进程`ID`,即使指定了`$task_worker_id`,在模式`3`下也是无效的。
> 模式`3`会影响`sendMessage`方法,使`sendMessage`发送的消息会随机被某一个`task`进程获取
#### 注意事项
使用消息队列通信,**如果`Task`进程处理能力低于投递速度,可能会引起`Worker`进程阻塞。**
';