Python 芹菜加工

Python 芹菜加工,python,celery,Python,Celery,我有一个CPU密集型芹菜任务,在其中一个任务中,可以使用joblib进一步并行化。默认情况下,用芹菜启动工作进程将创建一个池,最大并发数等于CPU/核心数(在我的例子中是36) 我的问题是,使用这种配置是否意味着每个工作进程将只有一个可使用的内核,并且不会从joblib的并行化中受益?或者,当工人队列中没有其他任务时,它将使用所有核心 例如: @app.task # picked by celery worker process def a_task(): algo = Algo(n_

我有一个CPU密集型芹菜任务,在其中一个任务中,可以使用joblib进一步并行化。默认情况下,用芹菜启动工作进程将创建一个池,最大并发数等于CPU/核心数(在我的例子中是36)

我的问题是,使用这种配置是否意味着每个工作进程将只有一个可使用的内核,并且不会从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使用

芹菜工人进程执行的任务使用joblib.Parallel,无论您选择哪个后端(多处理或线程),最终都会过度利用。(我认为在这种情况下,使用joblib.Parallel和n_jobs=1没有任何意义)


这意味着在重载情况下,机器上的每个内核将运行1个芹菜工作进程,以及许多(取决于j_作业值)joblib.并行进程或线程(取决于后端设置)。

如果我们谈论的是CPython,解释器本身只将单个进程的执行限制在一个核心上,这就是芹菜工人进程——单个CPython解释器进程。但是请记住,在这种情况下,在这些辅助进程内运行的任务使用joblib.Parallel,并根据后端类型生成n_作业进程或线程。没有任何东西限制CPython进程创建子进程和/或线程!当然,我只是对您的陈述进行了澄清,“芹菜不能限制工作进程使用单个内核”。CPython实现将工作进程限制为单核。你其余的回答和评论都是准确有效的。不需要感叹号,我写的东西我都留下了。芹菜不能停止它的工作进程-Python进程-最大限度地使用所有可用的内核。。。这只能由操作系统来完成(例如,通过
任务集
工具)。是的,你是对的,但似乎joblib与芹菜工人进程不兼容(更具体地说是billard)。。。只有将后端设置为
threading
时,joblib才起作用。否则,它将根据此(链接)强制joblib使用jobs=1[