Celery中的工作进程

4
我有一个CPU密集型的Celery任务,在其中一个任务中可以使用joblib进一步并行化。默认情况下,使用celery启动Worker时,将创建一个池,其最大并发数等于CPU/核心数(在我的情况下为36)。
我的问题是,使用这种配置是否意味着每个工作进程只有一个核心可用,并且无法从joblib的并行化中获益?或者当工作进程的队列中没有其他任务时,它会使用所有核心?
例如:
@app.task  # picked by celery worker process
def a_task():
    algo = Algo(n_jobs=5)  # further parallelization in the task
    ....
1个回答

1
不,Celery无法限制工作进程使用单个内核。操作系统会决定如何分配这36个工作进程的负荷,但是可以说每个进程都有一个内核来运行。需要提醒您的是,在您的情况下,工作进程几乎不占用CPU。大部分CPU时间将被joblib使用。
由Celery工作进程执行的任务使用joblib.Parallel,无论选择哪种后端(多处理或线程),都会过度利用。在这种情况下,使用n_jobs=1的joblib.Parallel没有意义。
这意味着在重负载下,计算机上的每个内核将运行1个Celery工作进程,以及许多(取决于j_jobs值)joblib.Parallel进程或线程(取决于后端设置)。

如果我们谈论的是CPython,解释器本身限制单个进程的执行仅限于一个核心。 - ElmoVanKielmo
这就是Celery工作进程,即各个CPython解释器进程。但请记住,在这种情况下,运行在这些工作进程内部的任务使用joblib.Parallel,并且根据后端类型生成n_jobs进程或线程。没有任何限制CPython进程创建子进程和/或线程的操作! - DejanLekic
没问题,我只是在澄清你的说法,“Celery无法限制工作进程使用单个核心”。工作进程受到CPython实现的单核限制。你的其余回答和评论都很准确有效,不需要感叹号。 - ElmoVanKielmo
我坚持我所写的内容。Celery无法停止其工作进程 - Python进程 - 以将所有可用核心最大化利用...这只能由操作系统完成(例如通过taskset工具)。 - DejanLekic
是的,你说得对,但似乎joblib与celery worker进程(具体来说是billard)不兼容...只有在将后端设置为“threading”时,joblib才能正常工作。否则,它将强制使用jobs=1,如此链接所述:https://github.com/celery/celery/issues/4551#issuecomment-427325793 - Coderji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接