- Process\Pool->start
- 进程管理
- 信号处理
Process\Pool->start
启动工作进程。
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);}});
