42

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

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

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

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

4

1 回答 1

9

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

  • 你将不得不处理优雅的关闭,让你的工作人员有机会完成当前的任务。
  • 有时,当您重新启动烧瓶应用程序时,您的工作人员不会准时停止,并且可能会在您启动另一个工作人员时逗留。

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

脚本 + crontab

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

监督者

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

uwsgi

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

芹菜

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

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

结论

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

于 2017-07-04T21:24:16.673 回答