注意事項
定時器使用注意事項
1、只能在onXXXX
回調(diào)中添加定時器。全局的定時器推薦在onWorkerStart
回調(diào)中設(shè)置,針對某個連接的定時器推薦在onConnect
中設(shè)置。
2、添加的定時任務(wù)在當前進程執(zhí)行(不會啟動新的進程或者線程),繁重的任務(wù)可能會影響當前進程執(zhí)行其它任務(wù),所以最好將耗時的任務(wù)放到單獨的進程運行,例如建立一個/多個Worker進程運行
3、當前進程沒有開啟swoole/swow協(xié)程的情況下,當前進程忙于其它業(yè)務(wù)時或者當一個任務(wù)沒有在預(yù)期的時間運行完,這時又到了下一個運行周期,則會等待當前任務(wù)完成才會運行,這會導(dǎo)致定時器沒有按照預(yù)期時間間隔運行。也就是說當前進程的業(yè)務(wù)都是串行執(zhí)行的,如果是多進程則進程間的任務(wù)運行是并行的。
4、需要注意多進程設(shè)置了定時任務(wù)造可能會造成并發(fā)問題,例如下面的代碼每秒會打印5次。
$worker = new Worker();
// 5個進程
$worker->count = 5;
$worker->onWorkerStart = function(Worker $worker) {
// 5個進程,每個進程都有一個這樣的定時器
Timer::add(1, function(){
echo "hi\r\n";
});
};
Worker::runAll();
如果只想要一個進程運行定時器,參考Timer::add 示例2
5、可能會有1毫秒左右的誤差。
6、定時器不能跨進程刪除,例如a進程設(shè)置的定時器無法在b進程直接調(diào)用Timer::del接口刪除
7、不同進程間的定時器id可能會重復(fù),但是同一個進程內(nèi)產(chǎn)生的定時器id不會重復(fù)
8、更改系統(tǒng)時間后會影響定時器的行為,所以更改系統(tǒng)時間后建議restart重啟