🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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`进程阻塞。**