2014-10-04 67 views
2

我需要在Web应用程序的后台运行一些任务(检查代码等)而不阻止视图。金字塔web应用程序中的长时间运行任务

典型Queue/Celery方案的转折是,我必须确保任务将完成,甚至生存的web应用程序死机或重启,直到这些任务完成后,无论其最终结果。

我正在考虑在数据库中记录multiprocessing.Pool的参数,并在webapp重新启动时启动所有不完整的任务。这是可行的,但我想知道是否有一个更简单或更具成本效益的方法?

更新:为什么不芹芹本身?那么,我在一些项目中使用了Celery,这确实是一个很好的解决方案,但是对于这个任务来说它是非常重要的:它需要一个单独的服务器,通信等,而我需要的只是产生一些进程/线程,在他们的工作(git clone ...,svn co ...),并检查他们是否成功或失败。另一个问题是,我需要解决方案尽可能小,因为我必须遵循精心制定的企业准则,程序等,以及我必须经过的人力行政和官僚开销才能获得Celery。如果可以,我宁愿避免。

+0

您提到了芹菜 - 是什么让你解雇它并创造你自己的解决方案?该任务看起来像Celery – Sergey 2014-10-04 19:27:47

+0

@Sergey的典型用例:请参阅UPDATE – LetMeSOThat4U 2014-10-05 13:15:48

回答

2

我建议你使用芹菜。

芹菜不需要自己的服务器,你可以让一个工人在同一台机器上运行。您也可以使用SQL数据库而不是“真正的”队列/消息服务器(比如RabbitMQ)来建立一个“穷人队列” - 这个设置看起来非常类似于您所描述的内容,只有通过一个独立的进程来执行长期的操作,运行任务。

从网络服务器进程开始长时间运行的任务的问题是,在生产环境中,网络“工作人员”通常由网络服务器管理 - 可随时产生或杀死多个工作人员。您的方法的可行性将高度依赖于您使用的Web服务器及其配置。另外,如果多个工作人员都尝试执行某项任务,则可能会遇到一些并发问题。

除了芹菜,另一种选择是看UWSGI's spooler subsystem,尤其是如果你已经使用UWSGI。

相关问题