為什么定時器類 Timer 里面有一些 pcntl_alarm的函數,我不明白為什么要用這些函數,workerman的定時器我看并不依賴于pcntl_alarm,是用libevent擴展或者event擴展 或者超時來實現的毫秒級的定時器。
public static function signalHandle()
{
if (!self::$_event) {
\pcntl_alarm(1);
self::tick();
}
}
意思是沒任何event那么就用 pcntl_alarm 來實現mi秒級定時器嗎?
主進程和子進程定時器區(qū)別:
主進程使用的是pcntl_alarm做定時。子進程使用event擴展/libevent擴展或者stream_select的超時機制做定時。
主進程是秒級定時器,子進程是毫秒級定時器。
因為主進程不處理業(yè)務,秒級定時器對于主進程來說已經可以滿足需要。
原因
至于為什么主進程單獨使用pcntl_alarm做定時,主要是因為主進程如果使用event擴展/libevent擴展做定時后,
子進程會繼承主進程已經初始化帶有定時的event/libevent實例,導致子進程發(fā)生不可預知的定時邏輯。
另外子進程和主進程共享一個event/libevent實例,當子進程由于退出等操作銷毀event/libevent實例時,對主進程也有可能產生不可預知的影響。