2012-07-09 58 views
4

我有一個Flask網絡應用程序,它顯示來自rss提要的信息。我想定期處理RSS feed,例如每30分鐘一次。提取一些信息並將其存儲在sqlite數據庫中。使APScheduler在網絡應用程序的後臺運行

但我不知道如何安排一個函數到一定的時間間隔。

我已經使用了APScheduler,和我的代碼如下:

def main(): 
    # Start the scheduler 
    filename = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'tmp')) + '\\' + 'spider.log' 
    logging.basicConfig(filename=filename, level=logging.DEBUG,format='%(levelname)s[%(asctime)s]: %(message)s') 
    sched = Scheduler() 
    sched.start() 
    sched.add_interval_job(run_job, minutes=30) 
    time.sleep(9999) 

我有一個run.py功能

from app import app, spider 

spider.main() 
app.run(debug=True) 

app.run(debug=True)開始瓶的Web應用程序。問題是代碼永遠不會達到app.run

那麼是否有可能產生另一個進程來處理spider.main()調用,並在後臺運行進程?或者我應該使用另一種方法?

注:我知道我可以使用燒瓶芹菜,但對於這個小的應用程序,這似乎太重量級...

回答

4

你不需要time.sleep - 當您運行spider.main啓動您的調度程序和然後讓進程休眠9999秒 - 之後它將運行下一行。因此app.run將在spider.main開始後〜2.78小時開始。

所以spider應該是這樣的:

def main(): 
    # Start the scheduler 
    filename = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'tmp')) + '\\' + 'spider.log' 
    logging.basicConfig(filename=filename, level=logging.DEBUG,format='%(levelname)s[%(asctime)s]: %(message)s') 
    sched = Scheduler() 
    sched.start() 
    sched.add_interval_job(run_job, minutes=30) 
+0

謝謝,它的工作原理! 我的代碼基於這個答案APScheduler沒有啓動,並且無法在沒有睡眠的情況下工作,但是重新安排代碼使它在沒有睡眠的情況下工作。 – happygoat 2012-07-11 06:56:50