定时器类 Timer 的疑惑,求大神解答

小阳光

为什么定时器类 Timer 里面有一些 pcntl_alarm的函数,我不明白为什么要用这些函数,workerman的定时器我看并不依赖于pcntl_alarm,是用libevent扩展或者event扩展 或者超时来实现的毫秒级的定时器。

public static function signalHandle()
{
    if (!self::$_event) {
        \pcntl_alarm(1);
        self::tick();
    }
}

意思是没任何event那么就用 pcntl_alarm 来实现mi秒级定时器吗?

3320 1 2
1个回答

walkor

主进程和子进程定时器区别:
主进程使用的是pcntl_alarm做定时。子进程使用event扩展/libevent扩展或者stream_select的超时机制做定时。
主进程是秒级定时器,子进程是毫秒级定时器。
因为主进程不处理业务,秒级定时器对于主进程来说已经可以满足需要。

原因
至于为什么主进程单独使用pcntl_alarm做定时,主要是因为主进程如果使用event扩展/libevent扩展做定时后,
子进程会继承主进程已经初始化带有定时的event/libevent实例,导致子进程发生不可预知的定时逻辑。
另外子进程和主进程共享一个event/libevent实例,当子进程由于退出等操作销毁event/libevent实例时,对主进程也有可能产生不可预知的影响。

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