Celery 与 ProcessPoolExecutor / ThreadPoolExecutor
Posted
技术标签:
【中文标题】Celery 与 ProcessPoolExecutor / ThreadPoolExecutor【英文标题】:Celery vs. ProcessPoolExecutor / ThreadPoolExecutor 【发布时间】:2016-09-14 09:52:18 【问题描述】:我正在创建一个 django 网络服务器,它允许用户在本地机器上运行一些“可执行文件”并通过网页分析它们的输出。
我以前使用过 Celery 任务队列,以便在类似情况下运行“可执行文件”。但是,在阅读了 Python concurrent.futures 之后,我开始怀疑是否应该使用 ThreadPoolExecutor
或 ProcessPoolExecutor
(或 ThreadPoolExecutor
在 ProcessPoolExecutor
:D 中)来代替?
谷歌搜索我只能找到 one relevant question 将 Celery 与 Tornado 进行比较,然后它转向单独使用 Tornado。
那么我应该使用 Celery 还是 PoolExecutor
作为我的简单网络服务器,为什么?
【问题讨论】:
【参考方案1】:如果出现以下情况,您需要使用 celery:
-
您希望独立于网络服务器轻松扩展
您想要一种方法来监控您的任务并在它们失败时重试它们
您想要创建更高级的任务执行模式(例如链接它们)
除此之外,这是一个非常成熟的库,附带项目,可以帮助您在 UI 演示方面也有帮助,请查看 Jobtastic。
如果您不需要列出的任何一点,您只需要执行此任务而不关心状态,也不需要特别的可扩展性,而不仅仅是保持简单。
关于使用ThreadPoolExecutor
或ProcessPoolExecutor
请记住,第二个将能够接收和返回仅可拾取的对象,并且第一个将生成附加到您的主进程的子线程(如果您不是,可能是您的网络服务器在另一个分离的进程中使用它),因此混合它们的方法可能有意义,具体取决于您的实现细节。
【讨论】:
我之前已经在我的代码中做到了这一点,我可以说它是可能的。有多个 processpoolexecutors 在其中运行线程池执行程序。我看到的唯一问题是 CPU 使用率在高负载时开始达到顶峰,这由 celery 管理得很好以上是关于Celery 与 ProcessPoolExecutor / ThreadPoolExecutor的主要内容,如果未能解决你的问题,请参考以下文章
Celery学习---Celery 与django结合实现计划任务功能