【问题标题】:Make APScheduler run in background in web app使 APScheduler 在 Web 应用程序的后台运行
【发布时间】:2012-07-09 03:16:31
【问题描述】:

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

但我不知道如何将函数安排到特定的时间间隔。

我用过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 Web 应用程序。问题是代码永远不会到达app.run

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

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

【问题讨论】:

    标签: python scheduling flask job-scheduling


    【解决方案1】:

    您不需要 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)
    

    【讨论】:

    • 谢谢,它有效!我的代码基于此答案 APScheduler 未启动,并且在没有睡眠的情况下无法使其工作,但是重新排列代码使其在没有睡眠的情况下工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2012-10-31
    相关资源
    最近更新 更多