有烧瓶的背景工作者

sta*_*ype 39 python flask

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

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

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

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

kar*_*daj 6

这种方法的缺点是,有很多方法可能会失败,特别是在停止和重新启动Flask应用程序之后。

  • 您将不得不进行正常关机,以使您的工人有机会完成其当前任务。
  • 有时,您的工作人员不会准时停止,并且在重新启动烧瓶应用程序时启动另一个工人时可能会流连忘返。

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

脚本+ crontab

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

监督的

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

乌斯吉

uwsgi是部署Flask应用程序的非常常用的方法。它具有很少的功能可用于管理后台工作人员。

芹菜

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

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

结论

为了减少进程数,我强烈建议您使用crontab基于解决方案的解决方案,因为它可以使您走得很长。但是请确保您的后台脚本留下了执行跟踪或某种形式的日志。