Timer定时器开发
Timer定時器開發(fā)
定時器的作用是不占線程的等待一個確定時間,同樣通過callback來通知定時器到期。
參考:https://github.com/sogou/workflow
定時器的創(chuàng)建
同樣是在WFTaskFactory類里的方法:
using timer_callback_t =
std::function<void (WFTimerTask*)>;
class WFTaskFactory
{
…
static WFTimerTask *create_timer_task(unsigned int microseconds,timer_callback_t callback);
};
第一個參數(shù)為定時時間,單位為微秒。除了程序退出,定時器不可以提前結(jié)束。
定時器任務(wù)里同樣有user_data域可以用來傳遞一些用戶數(shù)據(jù)。啟動方法和接入任務(wù)流的方法與其它任務(wù)沒有區(qū)別。
定時器的一個高級特征
在關(guān)于程序退出里講到,main函數(shù)結(jié)束或exit()被調(diào)用的時候,所有任務(wù)必須里運行到callback,并且沒有新的任務(wù)被調(diào)起。
這們就可能出現(xiàn)一個問題,定時器的最長定時時間超過了1小時,并且不能主動打斷。如果等定時器到期,程序退出需要很長時間。
而實現(xiàn)上,程序退出是可以打斷定時器,讓定時器回到callback的。如果定時器被程序退出打斷,get_state()會得到一個WFT_STATE_ABORTED狀態(tài)。
當然如果定時器被程序退出打斷,則不能再調(diào)起新的任務(wù)。
以下這個程序,每間隔一秒抓取一個一個http頁面。當所有url抓完畢,程序直接退出,不用等待timer回到callback,退出不會有延遲。
bool
program_terminate = false;
void timer_callback(WFTimerTask
*timer)
{
mutex.lock();if
(!program_terminate)
{WFHttpTask *task;if (urls_to_fetch
{task = WFTaskFactory::create_http_task(...);series_of(timer)->push_back(task);}series_of(timer)->push_back(WFTaskFactory::create_timer_task(1000000,
timer_callback));
}mutex.unlock();
}
…
int main()
{
..../* all urls done */mutex.lock();program_terminate = true;mutex.unlock();return 0;
}
以上程序,timer_callback必須在鎖里判斷program_terminate條件,否則可能在程序已經(jīng)結(jié)束的情況下又調(diào)起新任務(wù)。 由于使用上有一定難度,程序應(yīng)該盡量避免使用這個特征,而應(yīng)該等所有定時器都回到callback,再結(jié)束程序。
定時時間不夠用怎么辦
目前定時器最長定時用期約4200秒,如果程序的任務(wù)為24小時啟動一次,則需要一個24小時的定時。可以簡單地添加多個定時器。
例如:
void timer_callback(WFTimerTask
*timer)
{
mutex.lock();if (program_terminate)series_of(timer)->cancel();mutex.unlock();
}
void my_callback(WFMyTask *task)
{
SeriesWork *series = series_of(task);WFTimerTask *timer;for (int i = 0; i < 24; i++){timer = WFTaskFactory::create_timer_task(3600U*1000*1000,
timer_callback);
series->push_back(timer);}WFMyTask *next_task = MyFactory::create_my_task(...,
my_callback);
series->push_back(next_task);
}
因為timer_task是一種耗費資源非常小的任務(wù),所以可以創(chuàng)建非常多的timer。上例中創(chuàng)建24個1小時的定時器,每24小時執(zhí)行一個任務(wù)。
例子中也考慮了程序隨時可以退出的問題。在timer的callback里發(fā)現(xiàn)程序已經(jīng)退出,需要cancel余下的任務(wù)。
雖然我們的定時器可以被程序退出中斷,而且我們也支持把多個定時器串起來,實現(xiàn)一個很長的定時, 但這都不是我們推薦的做法。大多數(shù)情況下應(yīng)該避免太長時間的定時,并且應(yīng)該等所有定時器到期再結(jié)束程序。
總結(jié)
以上是生活随笔為你收集整理的Timer定时器开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matrix_multiply代码解析
- 下一篇: 算法编程Algos Programmin