我有一个基于python / Flask的webapp,它有一个连续运行的相应后台作业,定期轮询每个注册用户的数据。
我希望这个后台作业在系统启动时启动并继续运行直到它关闭。我没有设置/etc/rc.d脚本,而是在应用程序启动时让烧瓶应用程序生成一个新进程(使用多处理模块)。
因此,通过此设置,我只需要部署Flask应用程序,这也将使后台工作程序运行。
这有什么缺点?这是一个完整而彻底的黑客,在某种程度上是脆弱的,或者是一个很好的方式来设置一个具有相应后台任务的webapp?
您的方法的缺点是,有很多方法可能会失败,特别是在停止和重新启动烧瓶应用程序时。
以下是我建议的一些方法,具体取决于您的约束:
您只需编写一个脚本来执行您想要的任何任务,cron
将每隔几分钟为您运行一次。优点:cron
将定期为您运行,并将在系统启动时启动。缺点:如果任务花费的时间太长,您可能会同时运行多个脚本实例。你可以找到这个问题的一些解决方案here。
supervisord
是处理不同守护进程的巧妙方式。您可以将其设置为运行您的应用程序,后台脚本或both,并让它们从服务器开始。唯一的缺点是你必须安装supervisord
并确保它的守护进程在服务器启动时运行。
uwsgi
是部署烧瓶应用程序的一种非常常见的方式。它几乎没有features可以派遣用于管理后台工作人员。
Celery是一个基于分布式消息传递的异步任务队列/作业队列。它专注于实时操作,但也支持调度。我认为这是为烧瓶应用程序或任何其他基于python的应用程序安排后台任务的最佳解决方案。但使用它会带来一些额外的体积。您将至少引入以下过程: - 代理(rabbitmq或redis) - 工作者 - 调度程序
您还可以获取supervisord
来管理上述所有进程,并在服务器启动时启动它们。
在您减少进程数量的过程中,我强烈建议使用基于crontab
的解决方案,因为它可以为您提供很长的路要走。但请确保您的后台脚本留下执行跟踪或某种类型的日志。