python - Celery 中的工作进程
问题描述
我有一个 CPU 密集型 Celery 任务,在其中一项任务中,它可以使用 joblib 进一步并行化。默认情况下,使用 celery 启动 worker 将创建一个最大并发数等于 CPU/核心数(在我的情况下为 36)的池。
我的问题是,使用这种配置,是否意味着每个工作进程将只有 1 个核心可供使用,并且不会从 joblib 的并行化中受益?或者当worker队列中没有其他任务时它会使用所有核心。
例如:
@app.task # picked by celery worker process
def a_task():
algo = Algo(n_jobs=5) # further parallelization in the task
....
解决方案
不,不是的。- Celery 不能限制工作进程使用单核。操作系统如何分配这 36 个工作进程的负载取决于操作系统,但是可以说每个工作进程都有一个内核可以运行。提醒您一下,在您的情况下,工作进程几乎不会占用 CPU。大部分 CPU 时间将由 joblib 使用。
由 Celery 工作进程执行的任务使用 joblib.Parallel 并且无论您选择哪种后端(多处理或线程),最终都会过度使用。(我认为在这种情况下将 joblib.Parallel 与 n_jobs=1 一起使用是没有意义的)
这意味着在重负载下,您机器上的每个核心将运行 1 个 Celery 工作进程,以及许多(取决于 j_jobs 值)joblib.Parallel 进程或线程(取决于后端设置)。
推荐阅读
- android -
无法选择任何模拟器来运行代码 - node.js - 如何使用两个不同的节点版本运行两个不同的 nodejs 应用程序
- linux - Linux“猫”如何解码文件?
- c# - 使用 .NET 从公钥字节进行 RSA/ECB/PKCSPadding1 加密
- javascript - 无法使用 Highcharts 创建折线图 - Vue.js
- azure - Azure APIM 是否支持 405(不允许的方法)状态码?
- css - 遮罩图像css,使其仅显示圆圈的一部分
- javascript - javascript Uncaught (in promise) DOMException
- javascript - 未捕获(承诺):错误:运行时编译器未在 Angular 中加载
- node.js - 如何使用 Winston3 在 Windows 事件日志中记录事件?