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