Process\Pool

进程池,基于ServerManager模块实现。可管理多个工作进程。该模块的核心功能为进程管理,相比Process实现多进程,Process\Pool更加简单,封装层次更高,开发者无需编写过多代码即可实现进程管理功能。

此特性需要2.1.2或更高版本

常量定义

  • SWOOLE_IPC_MSGQUEUE :系统消息队列通信
  • SWOOLE_IPC_SOCKETSOCKET通信

异步支持

  • 可在onWorkerStart中使用Swoole提供的异步或协程API,工作进程即可实现异步
  • 底层自带的消息队列和SOCKET通信均为同步阻塞IO
  • 如果进程为异步模式,请勿使用任何自带的同步IPC进程通信功能 (无法使用message回调)

低于4.0版本需要在onWorkerStart末尾添加swoole_event_wait进入事件循环

使用实例

$workerNum = 10;
$pool = new Swoole\Process\Pool($workerNum);

$pool->on("WorkerStart", function ($pool, $workerId) {
    echo "Worker#{$workerId} is started\n";
    $redis = new Redis();
    $redis->pconnect('127.0.0.1', 6379);
    $key = "key1";
    while (true) {
         $msgs = $redis->brpop($key, 2);
         if ( $msgs == null) continue;
         var_dump($msgs);
     }
});

$pool->on("WorkerStop", function ($pool, $workerId) {
    echo "Worker#{$workerId} is stopped\n";
});

$pool->start();

  • 大佬黄

    我用了这个新的写法,但发现过几天进程就会莫名消失,有什么办法查吗

  • Ma.Alex

    你sleep 0.001 试一试

  • lyy

    子进程输出重定向怎么设置?? 还有父进程支持的信号控制呢??

  • 东方木

    swoole_process_pool 不支持 设置worker进程启动 用户吧

  • 大佬黄

    一直想问下,多进程模式和server的task任务队列没有什么区别吗,都能实现队列的功能