我有一个CPU密集型的Celery任务,在其中一个任务中,可以使用joblib进一步并行化。默认情况下,使用芹菜启动工作线程将创建一个最大并发数等于 CPU/内核数(在我的情况下为 36(的池。
我的问题是,使用这种配置,是否意味着每个工作进程将只有 1 个内核可供使用,并且不会从 joblib 的并行化中受益? 或者当工作线程队列中没有其他任务时,它会使用所有内核。
例如:
@app.task # picked by celery worker process
def a_task():
algo = Algo(n_jobs=5) # further parallelization in the task
....
不,它没有。 - 芹菜不能限制工作进程使用单个内核。这取决于操作系统如何分配这 36 个工作进程的负载,但是是的,您可以说每个工作进程都有一个内核来运行。只是为了提醒您,在您的情况下,工作进程几乎不占用 CPU。大部分 CPU 时间将由 joblib 使用。
Celery 工作进程执行的任务使用 joblib。并行,无论您选择哪种后端(多处理或线程(,您最终都会过度使用。(使用 joblib。我认为在这种情况下与 n_jobs=1 并行是没有意义的(
这意味着在重负载下,计算机上的每个内核将运行 1 个 Celery 工作进程,以及许多(取决于j_jobs值(joblib。并行进程或线程(取决于后端设置(。