Process\Pool->start

最后更新于:2022-04-02 06:36:06

# Process\\Pool->start [TOC] 启动工作进程。 ~~~ function Process\Pool::start() : bool; ~~~ * 启动成功,当前进程进入`wait`状态,管理工作进程 * 启动失败,返回`false`,可使用`swoole_errno`获取错误码 ~~~ $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(); ~~~ ## 进程管理 * 某个工作进程遇到致命错误、主动退出时管理器会进行回收,避免出现僵尸进程 * 工作进程退出后,管理器会自动拉起、创建一个新的工作进程 * 主进程收到`SIGTERM`信号时将停止`fork`新进程,并`kill`所有正在运行的工作进程 * 主进程收到`SIGUSR1`信号时将将逐个`kill`正在运行的工作进程,并重新启动新的工作进程 ## 信号处理 底层仅设置了主进程(管理进程)的信号处理,并未对`Worker`工作进程设置信号,需要开发者自行实现信号的监听。 * 工作进程为异步模式,请使用`Swoole\Process::signal`监听信号 * 工作进程为同步模式,请使用`pcntl_signal`和`pcntl_signal_dispatch`监听信号 在工作进程中应当监听`SIGTERM`信号,当主进程需要终止该进程时,会向此进程发送`SIGTERM`信号。如果工作进程未监听`SIGTERM`信号,底层会强行终止当前进程,造成部分逻辑丢失。 ~~~ $pool->on("WorkerStart", function ($pool, $workerId) { $running = true; pcntl_signal(SIGTERM, function () use (&$running) { $running = false; }); echo "Worker#{$workerId} is started\n"; $redis = new Redis(); $redis->pconnect('127.0.0.1', 6379); $key = "key1"; while ($running) { $msg = $redis->brpop($key); pcntl_signal_dispatch(); if ( $msgs == null) continue; var_dump($msg); } }); ~~~
';