swoole process父子进程使用队列通信
最近在研究一点swoole一方面的东西,打算用swoole process做一个工具,而且想用里面的queue作为父子进程通信的方式。看了官方的文档,发现使用useQueue的时候,这个并没有给样例,在push里面看到了一个例子,但是发现它实现的方式和文档对useQueue的介绍有些不一致。文档里面说useQueue如果将mode设置为2时(默认就是2),所有创建的子进程都会从队列中争抢消息的。但是push中给的例子却是遍历所有worker,向队列里面插入消息。感觉这方面怪怪的,在swoole群里面问了一下,几个人在聊开车,对我的问题不知道太简单还是不屑一顾,没有一个人回答。求人不如求己,于是就去看了一下useQueue、push、pop相关的源码,发现了官方文档上面说的还是对的,push里面的例子却是有些问题,感觉官方文档的例子放这么久一个不合适的例子有点不应该,不过开源的东西,靠大家自发的贡献,我们也不能要求太多了。
下面是我自己写的一个使用消息队列并设置为非阻塞模式的例子,同时已经更新到swoole process useQueue文档的示例中去了。
<?php
$worker_num = 2;
$process_pool = [];
$process= null;
$pid = posix_getpid();
function sub_process(swoole_process $worker)
{
sleep(1); //防止父进程还未往消息队列中加入内容直接退出
echo "worker ".$worker->pid." started".PHP_EOL;
while($msg = $worker->pop()){
if ($msg === false) {
break;
}
$sub_pid = $worker->pid;
echo "[$sub_pid] msg : $msg".PHP_EOL;
sleep(1);//这里的sleep模拟必须,否则可能1个worker就把所有信息全接受了
}
echo "worker ".$worker->pid." exit".PHP_EOL;
$worker->exit(0);
}
$customMsgKey = 1;//默认为空,这个地方可以随便填的
$mod = 2 | swoole_process::IPC_NOWAIT;//这里设置队列为非阻塞模式
//创建worker进程
for($i=0;$i<$worker_num; $i++) {
$process=new swoole_process('sub_process');
$process->useQueue($customMsgKey, $mod);
$process->start();
$pid = $process->pid;
$process_pool[$pid] = $process;
}
$messages = [
"Hello World!",
"Hello Cat!",
"Hello King",
"Hello Leon",
"Hello Rose"
];
//由于所有进程是共享使用1个消息队列,所以只需向一个字进程发送消息即可
$process = current($process_pool);
foreach ($messages as $msg) {
$process->push($msg);
}
swoole_process::wait();
swoole_process::wait();
echo "master exit".PHP_EOL;
如有问题请大家指正,useQueue文档地址。
近期评论