首页 > 解决方案 > 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
    ....

标签: pythoncelery

解决方案


不,不是的。- Celery 不能限制工作进程使用单核。操作系统如何分配这 36 个工作进程的负载取决于操作系统,但是可以说每个工作进程都有一个内核可以运行。提醒您一下,在您的情况下,工作进程几乎不会占用 CPU。大部分 CPU 时间将由 joblib 使用。

由 Celery 工作进程执行的任务使用 joblib.Parallel 并且无论您选择哪种后端(多处理或线程),最终都会过度使用。(我认为在这种情况下将 joblib.Parallel 与 n_jobs=1 一起使用是没有意义的)

这意味着在重负载下,您机器上的每个核心将运行 1 个 Celery 工作进程,以及许多(取决于 j_jobs 值)joblib.Parallel 进程或线程(取决于后端设置)。


推荐阅读