task_ipc_mode

设置Task进程与Worker进程之间通信的方式。

  • 1, 使用Unix Socket通信,默认模式
  • 2, 使用消息队列通信
  • 3, 使用消息队列通信,并设置为争抢模式

模式1

使用模式1时,支持定向投递,可在tasktaskwait方法中使用dst_worker_id,制定目标Task进程。

dst_worker_id设置为-1时,底层会判断每个Task进程的状态,向当前状态为空闲的进程投递任务。

消息队列模式

模式2和模式3使用sysvmsg消息队列通信。

  • 消息队列模式使用操作系统提供的内存队列存储数据,未指定 mssage_queue_key 消息队列Key,将使用私有队列,在Server程序终止后会删除消息队列。
  • 指定消息队列KeyServer程序终止后,消息队列中的数据不会删除,因此进程重启后仍然能取到数据
  • 可使用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进程阻塞。



  • 追求人生

    ipcs -q根本看不到有消息队列啊

  • 不死鸟

    这个 task_ipc_mode 仅仅是用于worker 与task之间,还是也同时用于reactor 与woker之间? 这里只说了能用于worker 与task之间,而另外在 pipe_buffer_size 的说明里,又说reacotor 与worker之间也是用这个task_ipc_mode 控制。。。 具体是怎样的呢, 能否澄清一下?

  • Θ清水流枫Θ

    设置 task_ipc_mode=3,不知道是不是出现死锁了,查看了好几个进程(strace -p)都卡在snmsg(好像是这么拼)这个地方,试了好多次,屡试不爽。后来改成1模式就好了

  • Θ清水流枫Θ

    使用最新的版本

  • Θ清水流枫Θ

    刚才重现了,卡在msgsnd函数中,一直不动

  • why

    模式1不是争抢模式,只有 3 是争抢。

  • 高级开发架构师

    感觉有点难看懂

  • gy_Ai_fps

    task_ipc_mode 设置为2的时候,task_enable_coroutine为true ,开启task内调用协程,start启功报错:Fatal error: Swoole\Server::set(): cannot use msgqueue when task_enable_coroutine is enable