swoole_process->useQueue

启用消息队列作为进程间通信。useQueue方法接受2个可选参数。

bool swoole_process->useQueue (int $msgkey = 0, int $mode = 1);

例子

<?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);