Celery 与 ProcessPoolExecutor / ThreadPoolExecutor

Posted

技术标签:

【中文标题】Celery 与 ProcessPoolExecutor / ThreadPoolExecutor【英文标题】:Celery vs. ProcessPoolExecutor / ThreadPoolExecutor 【发布时间】:2016-09-14 09:52:18 【问题描述】:

我正在创建一个 django 网络服务器,它允许用户在本地机器上运行一些“可执行文件”并通过网页分析它们的输出。

我以前使用过 Celery 任务队列,以便在类似情况下运行“可执行文件”。但是,在阅读了 Python concurrent.futures 之后,我开始怀疑是否应该使用 ThreadPoolExecutorProcessPoolExecutor(或 ThreadPoolExecutorProcessPoolExecutor:D 中)来代替?

谷歌搜索我只能找到 one relevant question 将 Celery 与 Tornado 进行比较,然后它转向单独使用 Tornado。

那么我应该使用 Celery 还是 PoolExecutor 作为我的简单网络服务器,为什么?

【问题讨论】:

【参考方案1】:

如果出现以下情况,您需要使用 celery:

    您希望独立于网络服务器轻松扩展 您想要一种方法来监控您的任务并在它们失败时重试它们 您想要创建更高级的任务执行模式(例如链接它们)

除此之外,这是一个非常成熟的库,附带项目,可以帮助您在 UI 演示方面也有帮助,请查看 Jobtastic。

如果您不需要列出的任何一点,您只需要执行此任务而不关心状态,也不需要特别的可扩展性,而不仅仅是保持简单。

关于使用ThreadPoolExecutorProcessPoolExecutor 请记住,第二个将能够接收和返回仅可拾取的对象,并且第一个将生成附加到您的主进程的子线程(如果您不是,可能是您的网络服务器在另一个分离的进程中使用它),因此混合它们的方法可能有意义,具体取决于您的实现细节。

【讨论】:

我之前已经在我的代码中做到了这一点,我可以说它是可能的。有多个 processpoolexecutors 在其中运行线程池执行程序。我看到的唯一问题是 CPU 使用率在高负载时开始达到顶峰,这由 celery 管理得很好

以上是关于Celery 与 ProcessPoolExecutor / ThreadPoolExecutor的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Celery 与 asyncio 结合使用?

Celery学习---Celery 与django结合实现计划任务功能

celery原理与组件

Celery 3 版本 定时执行与 异步执行 | Django 案例

与 celery 正在进行的任务交互

分布式任务队列Celery入门与进阶