• Process\Pool->start
    • 进程管理
    • 信号处理

    Process\Pool->start

    启动工作进程。

    1. function Process\Pool::start() : bool;
    • 启动成功,当前进程进入wait状态,管理工作进程
    • 启动失败,返回false,可使用swoole_errno获取错误码
    1. $workerNum = 10;
    2. $pool = new Swoole\Process\Pool($workerNum);
    3. $pool->on("WorkerStart", function ($pool, $workerId) {
    4. echo "Worker#{$workerId} is started\n";
    5. $redis = new Redis();
    6. $redis->pconnect('127.0.0.1', 6379);
    7. $key = "key1";
    8. while (true) {
    9. $msgs = $redis->brpop($key, 2);
    10. if ( $msgs == null) continue;
    11. var_dump($msgs);
    12. }
    13. });
    14. $pool->on("WorkerStop", function ($pool, $workerId) {
    15. echo "Worker#{$workerId} is stopped\n";
    16. });
    17. $pool->start();

    进程管理

    • 某个工作进程遇到致命错误、主动退出时管理器会进行回收,避免出现僵尸进程
    • 工作进程退出后,管理器会自动拉起、创建一个新的工作进程
    • 主进程收到SIGTERM信号时将停止fork新进程,并kill所有正在运行的工作进程
    • 主进程收到SIGUSR1信号时将将逐个kill正在运行的工作进程,并重新启动新的工作进程

    信号处理

    底层仅设置了主进程(管理进程)的信号处理,并未对Worker工作进程设置信号,需要开发者自行实现信号的监听。

    • 工作进程为异步模式,请使用Swoole\Process::signal监听信号
    • 工作进程为同步模式,请使用pcntl_signalpcntl_signal_dispatch监听信号
      在工作进程中应当监听SIGTERM信号,当主进程需要终止该进程时,会向此进程发送SIGTERM信号。如果工作进程未监听SIGTERM信号,底层会强行终止当前进程,造成部分逻辑丢失。
    1. $pool->on("WorkerStart", function ($pool, $workerId) {
    2. $running = true;
    3. pcntl_signal(SIGTERM, function () use (&$running) {
    4. $running = false;
    5. });
    6. echo "Worker#{$workerId} is started\n";
    7. $redis = new Redis();
    8. $redis->pconnect('127.0.0.1', 6379);
    9. $key = "key1";
    10. while ($running) {
    11. $msg = $redis->brpop($key);
    12. pcntl_signal_dispatch();
    13. if ( $msgs == null) continue;
    14. var_dump($msg);
    15. }
    16. });