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