Pyramid Web应用中的长时间运行任务

4
我需要在Web应用程序的后台运行一些任务(检查代码等),而不会阻塞视图。
在典型的队列/ Celery 场景中,需要注意的是,我必须确保任务完成,即使 Web 应用程序崩溃或重新启动,直到这些任务完成为止,无论它们的最终结果如何。
我考虑在数据库中记录 multiprocessing.Pool 的参数,并在 Web 应用程序重新启动时启动所有未完成的任务。这是可行的,但我想知道是否有更简单或更具成本效益的方法?
更新:为什么不使用 Celery?嗯,我在一些项目中使用过 Celery,它确实是一个很好的解决方案,但对于这个任务来说,它太大了:它需要一个单独的服务器、通信等,而我所需要的只是生成一些进程/线程,在其中执行一些工作(git clone..., svn co...)并检查它们是否成功或失败。另一个问题是,我需要尽可能地使解决方案尽可能小,因为我必须遵循复杂的公司指南、程序等,我需要通过的人力行政和官僚开销是我如果可以避免就更好了。

你提到了Celery - 什么原因让你放弃它,发明自己的解决方案?这个任务看起来像是Celery的典型用例。 - Sergey
1个回答

2

我建议您使用Celery。

Celery不需要自己的服务器,您可以在同一台机器上运行一个worker。您还可以使用SQL数据库而不是“真正”的队列/消息服务器(如RabbitMQ)来创建一个“穷人的队列”,这个设置看起来非常像您所描述的,只是有一个单独的进程来执行长时间运行的任务。

从Web服务器进程启动长时间运行的任务的问题在于,在生产环境中,Web“工作者”通常由Web服务器管理 - 可以随时生成或终止多个工作者。您的方法的可行性高度取决于您正在使用的Web服务器及其配置。此外,如果每个工作者都尝试执行任务,则可能会出现某些并发问题。

除了Celery之外,另一个选择是查看UWSGI的spooler子系统,特别是如果您已经在使用UWSGI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接