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

Process\Pool::__construct

创建进程池。函数原型:

function Process\Pool::__construct(int $worker_num, int $ipc_type = 0, int $msgqueue_key = 0, bool $enable_coroutine = false);

参数

  • $worker_num:指定工作进程的数量
  • $ipc_type 进程间通信的模式,默认为0表示不使用任何进程间通信特性
    • 设置为0时必须设置onWorkerStart回调,并且必须在onWorkerStart中实现循环逻辑,当onWorkerStart函数退出时工作进程会立即退出
    • 设置为SWOOLE_IPC_MSGQUEUE表示使用系统消息队列通信,可设置$msgqueue_key指定消息队列的KEY,未设置消息队列KEY,将申请私有队列
    • 设置为SWOOLE_IPC_SOCKET表示使用Socket进行通信,需要使用listen方法指定监听的地址和端口
    • 使用非0设置时,必须设置onMessage回调,onWorkerStart变更为可选
  • $enable_coroutine:启用协程,使用协程后将无法设置onMessage回调,并且只能使用SWOOLE_IPC_UNIXSOCK通信方式

协程模式

4.4版本中Process\Pool模块增加了对协程的支持,可以配置第4个参数为true来启用。启用协程后底层会

  • 禁止设置onMessage事件回调
  • onWorkerStart时创建协程,在回调函数中可直接使用协程相关API
  • 可使用$pool->getProcess()->exportSocket()导出管道句柄,实现Worker进程间通信
$pool = new Swoole\Process\Pool(1, SWOOLE_IPC_NONE, 0, true);

$pool->on('workerStart', function (Swoole\Process\Pool $pool, int $workerId) {
    while (true) {
        Co::sleep(0.5);
        echo "hello world\n";
    }
});

$pool->start();

消息队列

在使用SWOOLE_IPC_MSGQUEUE时可使用sysvmsg扩展提供的消息队列API向工作进程投递任务。

$q = msg_get_queue($key);
foreach (range(1, 100) as $i) {
    $data = json_encode(['data' => base64_encode(random_bytes(1024)), 'id' => uniqid(), 'index' => $i,]);
    msg_send($q, $i, $data, false);
}
  • 必须传入Pool创建时使用的key
  • 底层不支持msg_send的第二个参数mtype,请传入任意非0

  • 天弋

    第三个参数传个值进去?又如何操作私有队列呢?

  • 赞

    是用这个swoole_process::daemon来实现守护进程吗?社区版https://group.swoole.com/account/captcha/验证码没有GD扩展,不能找回密码

  • 15213026209

    消息队里的key值怎么设置?

  • 15573742616

    server服务器不能用进程池?