2012-07-09 61 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