python - 在基于 celery 的 Web 应用程序中运行使用 concurrent.futures 的 python 程序
问题描述
我正在开发一个使用 celery 进行分布式异步进程的 django 应用程序。现在我的任务是集成一个最初在代码中使用 concurrent.futures 编写的流程。所以我的问题是,这项具有并发期货处理的工作可以在芹菜任务队列中工作吗?它会引起任何问题吗?如果是这样,那么前进的最佳方式是什么。之前编写的并发进程是资源密集型的,因为它能够避免 GIL。此外,由于它,它非常快。不仅该进程使用 concurrent.futures.ProcessPoolExecutor 并且在其中还有其他几个 (<5) concurrent.futures.ThreadPoolExecutor 作业。
所以现在真正的问题是我们应该提取进程的所有核心功能并通过将它们分解为 celery 应用程序任务来重新编写它们,还是只保留原始代码并将其作为 celery 队列中的一大段代码运行。
根据系统的设计,系统的用户可以提交几个这样的芹菜任务,其中将包含并发期货代码。
任何帮助将不胜感激。
解决方案
您的库应该无需修改即可工作。在 Celery 中运行线程代码并没有什么坏处,除非您将 gevent 与非 gevent 兼容的代码混合在一起。
分解代码的原因是资源管理(减少内存/CPU 开销)。使用线程,您要监控的是 CPU 负载。一旦您的并发性导致足够的负载(例如线程执行 CPU 密集型工作),操作系统将开始在线程之间交换,并且您的处理变得更慢,而不是更快。
推荐阅读
- google-chrome-extension - 自托管 Chrome 扩展程序
- scala - 创建空的scala可变序列并添加到它
- html - 删除引导容器的边距和填充
- rust - 将 std::cmp::Reverse 与 binary_search_by_key 一起使用
- python - Python 深度优先搜索在找到时停止
- jsf - 使用 Netbeans 12.1 和 Wildfly 18.0.1 进行 JAVAEE 应用程序的 Deploy/HotDeploy 问题
- python - 使用传感器寻找机器学习问题的模型
- python - 将文件重命名为 .py 扩展名没有任何作用
- mysql - 数据模型问题:如何限定第三个对象
- python - Kivy RstDocument 中心对齐其所有内容