为什么在workerman里面的monitorWorkers方法里面 pcntl_signal_dispatch()写两遍

qpao123
protected static function monitorWorkers()
    {
        self::$_status = self::STATUS_RUNNING;
        while (1) {
            // Calls signal handlers for pending signals.
            pcntl_signal_dispatch();
            // Suspends execution of the current process until a child has exited, or until a signal is delivered
            $status = 0;
            $pid    = pcntl_wait($status, WUNTRACED);
            // Calls signal handlers for pending signals again.
            pcntl_signal_dispatch();
            。。。。。
  }
3875 2 0
2个回答

walkor

pcntl_signal_dispatch是检察是否有未处理的信号,如果有的话调对应信号的回调函数。

pcntl_wait是进入睡眠,如果有子进程退出事件或者其它信号事件就会被唤醒返回,程序继续向下执行。

pcntl_wait返回后 首先pcntl_signal_dispatch检查,然后处理子进程退出事件(如果有进程退出的话)。

处理进程退出事件过程中可能会有新的信号到来,在没有调用pcntl_signal_dispatch时这些信号不会被处理,所以在下次pcntl_wait是进入睡眠前再检查一遍,避免后来的信号没有被处理。

  • banzhiyanz 2019-07-17

    请问那是不是pcntl_signal_dispatch()就检测到一次有信号后,就结束了。如果在继续监听的话,就需要在pcntl_signal_dispatch()一次?
    对这个pcntl_signal_dispatch不是很好的理解,是一直监听系统是否有信号发送过来,还是监听到了一次后,就结束了

  • walkor 2019-07-17

    pcntl_signal_dispatch不是监听信号,是检查是否有未处理的信号。

qpao123

感谢大神的回复,太感激了。虽然理解的还不够深入。想请问下,workerman是怎么实现master-worker模型的。请求来了,master知道了,怎么通知worker工作,怎么把请求转过去的呢,希望大神指点一二

  • walkor 2019-03-08

    客户端直接和worker进程通讯,master进程不做任何业务逻辑

年代过于久远,无法发表回答
🔝