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