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