【swoole.2.03】多进程示例:使用swoole实现多进程处理费时任务--处理未回收的僵尸子进程

回顾

上一篇实现了一个简单的多进程结构,但是当主进程退出时子进程并不会回收,会变成僵尸进程常驻在系统中浪费系统资源。那么现在来解决这个问题

代码

class Job
{
    protected $masterPid;

    protected $workerNumber = 4;
    protected $queueKey = 1;
    protected $queueMod = 2 | \Swoole\Process::IPC_NOWAIT;//  异步非阻塞通信

    public function __construct()
    {
        $this->masterPid = getmypid();
        $this->worker();
        $this->wait();
    }

    public function worker()
    {
        for ($i = 0; $i < $this->workerNumber; $i++) {
            $process = new \Swoole\Process(function (\Swoole\Process $process) {
                var_dump($process->pid . '开始');
                while (true) {
                    $msg = $process->pop();
                    if ($msg) {
                        sleep(1);   //  处理耗时任务的操作
                        var_dump($process->pid . '完成了一个任务:' . $msg);
                    }
                    if (rand(0, 10) > 8) {
                        echo $process->pid . "退出";
                        break;
                    }
                }
            });
            $process->useQueue($this->queueKey, $this->queueMod);
            $process->start();
        }
    }

    public function wait()
    {
        //  信号监听
        \Swoole\Process::signal(SIGCHLD, function ($sig) {
            while ($res = \Swoole\Process::wait(false)) {
                var_dump("回收子进程", $res);
            }
        });
    }
}

new Job();

代码及分析

稍微封装了一下,使用Process::wait对已结束的子进程进行回收

array Process::wait(bool $blocking = true);

$result = array('code' => 0, 'pid' => 15001, 'signal' => 15);

在异步信号回调中执行wait

Process::signal(SIGCHLD, function($sig) {
  //必须为false,非阻塞模式
  while($ret =  Process::wait(false)) {
      echo "PID={$ret['pid']}\n";
  }
});

在主进程中监听SIGCHLD信号然后进行回收即可

SIGCHLD

SIGCHLD,在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。

通过注册信号事件,在子进程通知主进程结束的时候执行回调来回收掉他。

其他的问题

如果任务是不定时出现的呢?这里的模式是启动若干个子进程,往消息队列中发送消息,由worker来消费,但是为了节省系统资源,当消息队列没有消息时worker会全部退出,再有任务发送到消息队列时就没有worker来消费任务了。下一篇来在这个基础上做一个可自行弹性伸缩的多进程模型。

程序幼儿员-龚学鹏
请先登录后发表评论
  • latest comments
  • 总共0条评论