设置Task
进程与Worker
进程之间通信的方式。
- 1, 使用
Unix Socket
通信,默认模式 - 2, 使用消息队列通信
- 3, 使用消息队列通信,并设置为争抢模式
使用模式1
时,支持定向投递,可在task
和taskwait
方法中使用dst_worker_id
,制定目标Task
进程。
dst_worker_id
设置为-1
时,底层会判断每个Task
进程的状态,向当前状态为空闲的进程投递任务。
模式2
和模式3
使用sysvmsg
消息队列通信。
- 消息队列模式使用操作系统提供的内存队列存储数据,未指定 mssage_queue_key 消息队列
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
进程阻塞。