2016-01-20 96 views
3

我正在使用蟒蛇web.py框架apscheduler調度。 函數runserver應該在每天早上9點運行,但它不一致。 它運行大多數日子,但偶爾跳過一天。蟒蛇apscheduler並不一致

代碼:

import web 
from apscheduler.schedulers.blocking import BlockingScheduler #Blocking Scheduler 

#URLs 
urls = (
    '/startscheduler/','index', 
    ) 

Nightlysched = BlockingScheduler() 

@Nightlysched.scheduled_job('cron', hour=9) 
def runserver(): 
    print 2+2 #doing some calculations here 

#Main function to run the cron JOB 
if __name__ == "__main__": 
    Nightlysched.start() #stating the job 
    app = web.application(urls, globals()) 
    app.run() 

什麼是配置調度運行每天9.a.m正確的方法是什麼?

+1

我無法理解這段代碼是如何工作的。 Nightlysched.start()會阻止並且不會讓您的Web應用程序運行。也就是說,配置是正確的。請啓用調試日誌記錄(將「apscheduler」的loglevel設置爲DEBUG)以確定發生了什麼。 –

+0

調度程序啓動後(Nightlysched.start()))按預期運行Web應用程序。你能告訴我如何設置apscheduler的loglevel嗎?我嘗試了幾件事,但沒有奏效。謝謝 – ashishashen

回答

4

APScheduler有一個寬限期期間允許工作運行。如果由於某種原因調度程序繁忙和/或主機負載過高,APScheduler可能無法及時啓動作業。

在這種情況下,如果在寬限期內無法啓動作業(如果已初始化Python日誌記錄,則會記錄一條說明消息),則該作業將被丟棄。

根據實際的根本原因:

  • 如果調度未能安排在時間上的工作,你可以使用misfire_grace_time=None告訴APScheduler儘快,因爲它可以代替其丟棄調度作業。
  • 默認情況下,每個作業只允許同時運行一個實例。確保前一次運行已完成。可以通過在添加作業時使用關鍵字參數max_instances來設置調度程序允許併發運行的特定作業的最大實例數。在這種情況下,您也可能需要使用coalesce=False。只有在工作時間超過24小時(就您的情況而言)並且您接受可以同時運行兩個工作實例的情況下才能這樣做。
  • 如果有太多的作業正在運行,但機器負載不是很高,這意味着您的作業量超過了您可以同時運行的作業量。您可以嘗試增加APScheduler 執行器用於運行作業的線程池大小(這取決於您的設置,請檢查:http://apscheduler.readthedocs.org/en/latest/userguide.html)。

總之,我會先用misfire_grace_period嘗試:

@Nightlysched.scheduled_job('cron', hour=9, misfire_grace_time=None) 

作爲一個說明,但是,作爲@Alex提到我並不掌握,爲什麼你的代碼工作,因爲調用Nightlysched.start()應阻止並阻止您的Web應用程序運行。我想這是粘貼代碼,並不真正代表你正在運行。對我來說,看起來你應該使用像BackgroundScheduler這樣的非阻塞調度器。

+1

感謝您的詳細解釋jjmontes。我會試試這個。此外,我還認爲後臺調度程序是一個更好的選擇,但無法在9日每天使用後臺調度程序安排任務。我能找到的所有示例都是間隔配置的,比如scheduler.add_job(runfunction,'interval',minutes = 15)。你能告訴我如何將時間間隔轉換爲每日小時cron? – ashishashen

+0

嘗試'scheduler.add_job(your_function,trigger ='cron',hour = 9,misfire_grace_time = None)'。觸發器參數可以是「date」,「interval」或「c​​ron」,或者你甚至可以實現你自己的觸發器類(我從來不需要這樣做;))。 – jjmontes

+0

另外,看看[add_job的源代碼和文檔](https://bitbucket.org/agronholm/apscheduler/src/a6545cf29831bb6d8f055aeb2fa9d5204e9bd192/apscheduler/schedulers/base.py?at=master&fileviewer=file-view -default#base.py-315),我發現它非常有用! – jjmontes