× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

Process->push

投递数据到消息队列中。

bool Process->push(string $data);
  • $data要投递的数据,长度受限与操作系统内核参数的限制。默认为8192,最大不超过65536
  • 操作失败会返回false,成功返回true
  • 默认模式下(阻塞模式),如果队列已满,push方法会阻塞等待
  • 非阻塞模式下,如果队列已满,push方法会立即返回false

示例

$workers = [];
$worker_num = 2;

for($i = 0; $i < $worker_num; $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
    $recv = $worker->pop();

    echo "From Master: $recv\n";

    sleep(2);
    $worker->exit(0);
}

foreach($workers as $pid => $process)
{
    $process->push("hello worker[$pid]\n");
}

for($i = 0; $i < $worker_num; $i++)
{
    $ret = swoole_process::wait();
    $pid = $ret['pid'];
    unset($workers[$pid]);
    echo "Worker Exit, PID=".$pid.PHP_EOL;
}

  • 大隐-于市

    上面的代码,把sleep(2) 注释掉就会报错swoole_process::pop(): msgrcv() failed. Error: Invalid argument[22],这是何解

  • snipe

    是由于一个子进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 可以这样处理。不适用子进程争抢模式。

    $process->useQueue(0,1); 
    

    这个时候sleep就可以删掉了

  • snipe

    貌似不可以编辑,上面有个错别字 不使用子进程争抢模式。

    貌似也不支持markdown写法...

  • 大隐-于市

    改成 $process->useQueue(0,1); 后,执行几次,还是会同样的报错

  • 大隐-于市

    升级最新版master,已经没有上面的问题了

  • 漩涡

    那个是每个子进程 的队列是独立的,能不能把他做成所有的子线程公用同一个队列,我想实现简单的生产者和消费者模式

  • 漩涡

    完全没有人鸟我唉,, 实在不行我还是用python 实现吧。。

  • phpdragon

    From Master: hello worker[2244]

    From Master: hello worker[2245]

    Worker Exit, PID=2247 Worker Exit, PID=2248

    swoole-1.8.0-rc2

    这算bug么?

  • 秦宏全

    我想问下,foreach push 时是异步吗

  • 刘欣

    不使用子进程争抢模式 会产生僵尸进程吗?

  • 今生有你✅已认证了

    看文档真的是一脸懵逼啊,不怪别人,就是自己的底子太薄了