让APScheduler在Web应用程序的后台运行

时间:2012-07-09 17:13:14

标签: python scheduling flask job-scheduling

我有一个Flask网络应用,它显示来自RSS Feed的信息。我想定期处理rss,例如每30分钟。提取一些信息并将其存储在sqlite数据库中。

但我无法弄清楚如何将功能安排到特定的时间间隔。

我使用过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)启动Flask网络应用。问题是代码永远不会达到app.run

那么可以生成另一个进程来处理spider.main()调用,并在后台运行该进程吗?或者我应该使用其他方法吗?

NB:我知道我可以使用Flask-Celery,但对于这个小应用程序来说,这似乎太重了......

1 个答案:

答案 0 :(得分: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)