2014-10-21 113 views
3

我想讓我的主要任務在每天早上6點激發。但出於測試目的,我將間隔設置爲5秒。問題在於它似乎並沒有開火。我在maintask方法中有一個斷點,永遠不會到達並且沒有任何內容被打印到控制檯。我假設它沒有運行。apscheduler間隔任務未運行

ETA: 我的代碼進入了scheduler.start(),因爲它阻塞了,所以停止了。它應該在5秒內開始我的maintask,但它永遠不會。

Python版本是2.7 apscheduler版本是3.0

我已經在Windows和Debian同樣的結果吧。

這是我的代碼。

from apscheduler.schedulers.blocking import BlockingScheduler 
import datetime 


def maintask(): 
    print("blah") 


def main(): 

    scheduler = BlockingScheduler() 

    print("Scheduling Tasks") 
    start_time = (datetime.datetime.now()).replace(hour=6, minute=0, second=0, microsecond=0) 
    scheduler.scheduled_job(maintask, 'interval', id="MainTaskid", name="mainTask", start_date=start_time, seconds=5, misfire_grace_time=60) 
    print("Tasks Scheduled") 
    print("Running Tasks") 
    scheduler.start() 
    print("Good Bye") 
    return 0 


if __name__ == "__main__": 
    main() 
+0

當然,大部分代碼與問題無關。你能爲我們提供一個[最小例子](http://stackoverflow.com/help/mcve)嗎? – abarnert 2014-10-21 22:43:49

+0

另外,您使用的是什麼版本的APScheduler? – abarnert 2014-10-21 22:46:17

+0

最後,你已經在你的代碼中得到了所有這些日誌語句......那麼記錄什麼呢?它是否涉及到「運行任務」?關於「Good Bye」呢? – abarnert 2014-10-21 22:47:01

回答

3

的問題是,你使用scheduled_job代替add_job

正如User Guide所解釋的,scheduled_job主要用作裝飾器,因爲「便於聲明在應用程序運行時不會改變的作業」,而後者是「最常用的方法」添加工作。

在這種特殊情況下,我認爲問題在於add_job強制調度程序喚醒,並且scheduled_job不會 - 您認爲這不會是相關的,除非您依賴於喚醒強迫失火檢查在啓動時運行,而不是直到明天上午6點。

無論如何,只要將其更改爲add_job即可解決問題。

+0

ooooh。我讀了這是用戶指南中的裝飾器,但不知道這意味着什麼。從谷歌搜索它看起來就像一個類包裝,但功能。 – TheColonel26 2014-10-21 23:55:35

+0

@ TheColonel26:一個裝飾器...是一種在定義時間將類包裝器或函數包裝器應用於類或函數的方法。我認爲這不能很好地解釋它,但在評論中很難做到,參考文檔沒有多大幫助。 [PEP 318](http://legacy.python.org/dev/peps/pep-0318/)更具可讀性,或只是谷歌「Python裝飾教程」,你會發現很多博客文章,試圖澄清事情。 – abarnert 2014-10-22 00:59:07

+0

@ TheColonel26:簡短的版本是'@ spam'後面跟'def eggs():pass'基本上與def eggs():pass'後跟'eggs = spam(eggs)'相同,如果有幫助的話。所以,'spam'是一個接受函數的函數,並且(通常)返回一個包裝函數。 – abarnert 2014-10-22 01:00:23