swoole_process->useQueue
启用消息队列作为进程间通信。useQueue方法接受2个可选参数。
bool swoole_process->useQueue (int $msgkey = 0, int $mode = 1);
- $msgkey是消息队列的key,默认会使用ftok(FILE)
- $mode通信模式,默认为2,表示争抢模式,所有创建的子进程都会从队列中取数据
- 如果创建消息队列失败,会返回false。可使用swoole_strerror(swoole_errno()) 得到错误码和错误信息。
例子
<?php $workers = []; $worker_num = 2; for($i = $worker_num; $i > 0; $i--) { $process = new swoole_process('callback_function', false, false); //使用消息队列 $process->useQueue(); $pid = $process->start(); $workers[$pid] = $process; //echo "Master: new worker, PID=".$pid."\n"; } function callback_function(swoole_process $worker) { //echo "Worker: start. PID=".$worker->pid."\n"; //recv data from master while(true) { $recv = $worker->pop(); echo "From Master: $recv\n"; } sleep(2); $worker->exit(0); } while(true) { /** * @var $process swoole_process */ $pid = array_rand($workers); $process = $workers[$pid]; $process->push("hello worker[$pid]\n"); sleep(1); } for($i = $worker_num; $i > 0; $i--) { $ret = swoole_process::wait(); $pid = $ret['pid']; unset($workers[$pid]); echo "Worker Exit, PID=".$pid.PHP_EOL; }
- 使用模式2后,创建的子进程无法进行单独通信,比如发给特定子进程。
- $process对象并未执行start,也可以执行push/pop向队列推送/提取数据
- 消息队列通信方式与管道不可公用。消息队列不支持EventLoop,使用消息队列后只能使用同步阻塞模式
非阻塞
在1.9.2
或更高版本中增加了Process::IPC_NOWAIT
的支持,可将队列设置为非阻塞。在非阻塞模式下,队列已满调用push
方法、队列已空调用pop
方法时将不再阻塞立即返回。
//设置为非阻塞模式 $process->useQueue($key, $mode | Process::IPC_NOWAIT);