首页 > 解决方案 > 在基于 celery 的 Web 应用程序中运行使用 concurrent.futures 的 python 程序

问题描述

我正在开发一个使用 celery 进行分布式异步进程的 django 应用程序。现在我的任务是集成一个最初在代码中使用 concurrent.futures 编写的流程。所以我的问题是,这项具有并发期货处理的工作可以在芹菜任务队列中工作吗?它会引起任何问题吗?如果是这样,那么前进的最佳方式是什么。之前编写的并发进程是资源密集型的,因为它能够避免 GIL。此外,由于它,它非常快。不仅该进程使用 concurrent.futures.ProcessPoolExecutor 并且在其中还有其他几个 (<5) concurrent.futures.ThreadPoolExecutor 作业。

所以现在真正的问题是我们应该提取进程的所有核心功能并通过将它们分解为 celery 应用程序任务来重新编写它们,还是只保留原始代码并将其作为 celery 队列中的一大段代码运行。

根据系统的设计,系统的用户可以提交几个这样的芹菜任务,其中将包含并发期货代码。

任何帮助将不胜感激。

标签: pythondjangoceleryconcurrent.futures

解决方案


您的库应该无需修改即可工作。在 Celery 中运行线程代码并没有什么坏处,除非您将 gevent 与非 gevent 兼容的代码混合在一起。

分解代码的原因是资源管理(减少内存/CPU 开销)。使用线程,您要监控的是 CPU 负载。一旦您的并发性导致足够的负载(例如线程执行 CPU 密集型工作),操作系统将开始在线程之间交换,并且您的处理变得更慢,而不是更快。


推荐阅读