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

0
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();
。。。。。
}
已邀请:

walkor

赞同来自: 默然 mazhaozi

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


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


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


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

qpao123 - 小镇来的码农

赞同来自:

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

要回复问题请先登录注册