有烧瓶的背景工作者

问题描述 投票:36回答:1

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

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

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

这有什么缺点?这是一个完整而彻底的黑客,在某种程度上是脆弱的,或者是一个很好的方式来设置一个具有相应后台任务的webapp?

python flask
1个回答
5
投票

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

  • 您将不得不处理正常关机,以便让您的员工有机会完成当前任务。
  • 有时你的工人不会按时停下来,当你重新启动烧瓶应用程序时,你可能会在另一个工作时停留。

以下是我建议的一些方法,具体取决于您的约束:

script + crontab

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

supervisord

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

uwsgi

uwsgi是部署烧瓶应用程序的一种非常常见的方式。它几乎没有features可以派遣用于管理后台工作人员。

Celery

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

您还可以获取supervisord来管理上述所有进程,并在服务器启动时启动它们。

结论

在您减少进程数量的过程中,我强烈建议使用基于crontab的解决方案,因为它可以为您提供很长的路要走。但请确保您的后台脚本留下执行跟踪或某种类型的日志。

© www.soinside.com 2019 - 2024. All rights reserved.