Celery与ProcessPoolExecutor/ThreadPoolExecutor的比较

14
我正在创建一个Django Web服务器,允许用户在本地机器上运行一些“可执行文件”,并通过Web页面分析它们的输出。
我之前在类似情况下使用过Celery任务队列来运行“可执行文件”。但是,阅读了Python concurrent.futures后,我开始思考是否应该改用ThreadPoolExecutorProcessPoolExecutor(或在ProcessPoolExecutor内部使用ThreadPoolExecutor :D)?
通过谷歌搜索,我只找到一个相关问题将Celery与Tornado进行比较,并建议仅使用Tornado。
那么,对于我的简单Web服务器,我应该使用Celery还是PoolExecutor,为什么?
1个回答

7
您需要使用celery,如果:
  1. 您想轻松独立地扩展您的Web服务器
  2. 您想要一种监视任务并在它们失败时重试的方式
  3. 您想要创建更高级的任务执行模式(例如链接它们)
此外,这是一个非常成熟的库,带有辅助项目,可以帮助您在UI呈现方面,看看Jobtastic
如果您不需要上述任何内容,只需执行此任务而不太关心状态且没有特殊的可扩展性需求,则保持简单即可。
关于使用ThreadPoolExecutorProcessPoolExecutor,请记住后者只能接收和返回可选对象,而前者将生成附加到主进程(如果您未在另一个分离的进程中使用它,则为您的Web服务器)的子线程,因此根据您实现的详细信息,混合它们的方法可能是有意义的。

我之前在我的代码中完成了这个,并且我可以说它是可能的。有多个进程池执行器,其中线程池执行器运行。我唯一看到的问题是,在高负载下,CPU 使用率开始飙升,但是 Celery 很好地管理了这个问题。 - Tragaknight

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