启动工作进程。
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);
}
});