为什么定时器类 Timer 里面有一些 pcntl_alarm的函数,我不明白为什么要用这些函数,workerman的定时器我看并不依赖于pcntl_alarm,是用libevent扩展或者event扩展 或者超时来实现的毫秒级的定时器。
public static function signalHandle()
{
if (!self::$_event) {
\pcntl_alarm(1);
self::tick();
}
}
意思是没任何event那么就用 pcntl_alarm 来实现mi秒级定时器吗?
主进程和子进程定时器区别:
主进程使用的是pcntl_alarm做定时。子进程使用event扩展/libevent扩展或者stream_select的超时机制做定时。
主进程是秒级定时器,子进程是毫秒级定时器。
因为主进程不处理业务,秒级定时器对于主进程来说已经可以满足需要。
原因
至于为什么主进程单独使用pcntl_alarm做定时,主要是因为主进程如果使用event扩展/libevent扩展做定时后,
子进程会继承主进程已经初始化带有定时的event/libevent实例,导致子进程发生不可预知的定时逻辑。
另外子进程和主进程共享一个event/libevent实例,当子进程由于退出等操作销毁event/libevent实例时,对主进程也有可能产生不可预知的影响。
谢谢