【问题标题】:Background Worker with Flask带 Flask 的后台工作人员
【发布时间】:2012-06-30 15:26:58
【问题描述】:

我有一个基于 python/Flask 构建的 web 应用程序,它有一个相应的后台作业,该作业连续运行,定期轮询每个注册用户的数据。

我希望这个后台作业在系统启动时启动并一直运行直到它关闭。我没有设置 /etc/rc.d 脚本,而是让烧瓶应用程序在应用程序启动时产生一个新进程(使用多处理模块)。

因此,使用此设置,我只需要部署 Flask 应用程序,这样后台工作程序也会运行。

这样做有什么缺点?这是一个完整而彻底的 hack,在某种程度上是脆弱的,还是设置具有相应后台任务的 web 应用程序的好方法?

【问题讨论】:

  • 嘿,你找到解决方案了吗?这样做的最佳方法是什么?
  • 16K 次观看,近 5 年,26 次投票,只有一个答案。 Python社区,大家知道用烧瓶做芹菜的正确方法吗?有一个指南 How to use celery+flask for applications, larger that A+B 会很好,因为当你有 8-10 个任务和真正重要的 Web 服务器代码,覆盖单元测试时,现有的 flask-doc 和 celery-doc 很精简而且几乎没用.除了提议的tasks.py 可能是实际应用程序中的一个杂物,因为在真正的 应用程序中它会紧密耦合

标签: python flask


【解决方案1】:

您的方法的缺点是它可能会在很多方面失败,尤其是在停止和重新启动烧瓶应用程序时。

  • 您必须处理正常关闭,才能让您的工作人员有机会完成当前任务。
  • 有时您的工作人员不会按时停止,并且可能会在您重新启动烧瓶应用程序时启动另一个工作人员时逗留。

根据您的限制,我会建议一些方法:

脚本 + crontab

您只需编写一个脚本来执行您想要的任何任务,cron 会每隔几分钟为您运行一次。 优点cron 会定期为您运行,并在系统启动时启动。 缺点:如果任务花费的时间太长,您可能会同时运行多个脚本实例。你可以找到一些解决这个问题的方法here

主管

supervisord 是处理不同守护进程的好方法。您可以将其设置为运行您的应用程序、后台脚本或both,并让它们从服务器启动。唯一的缺点是你必须安装supervisord 并确保它的守护进程在服务器启动时正在运行。

uwsgi

uwsgi 是部署 Flask 应用程序的一种非常常见的方式。它很少有features 可以用来管理后台工作人员。

芹菜

Celery 是一个基于分布式消息传递的异步任务队列/作业队列。它专注于实时操作,但也支持调度。我认为这是 为烧瓶应用程序或任何其他基于 python 的应用程序安排后台任务的最佳解决方案。但是使用它会带来一些额外的体积。您将至少介绍以下流程: - 经纪人(rabbitmq 或 redis) - 一位工人 - 调度器

你也可以让supervisord管理上面的所有进程,让它们在服务器启动时启动。

结论

在您减少进程数量的过程中,我强烈建议您使用基于 crontab 的解决方案,因为它可以让您走得更远。但请确保您的后台脚本留下执行痕迹或某种形式的日志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多