【问题标题】:Worker processes in CeleryCelery 中的工作进程
【发布时间】:2019-09-26 07:05:16
【问题描述】:

我有一个 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
    ....

【问题讨论】:

    标签: python celery


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我们谈论的是 CPython,解释器本身会将单个进程的执行限制在一个内核上。
    • 这就是 Celery 工作进程 - 单独的 CPython 解释器进程。但请记住,在这种情况下,在这些工作进程中运行的任务使用 joblib.Parallel 并根据后端类型生成 n_jobs 进程或线程。没有什么限制 CPython 进程创建子进程和/或线程!
    • 当然,我只是在精确您的陈述“Celery 不能限制工作进程使用单核”。工作进程被 CPython 实现限制为单核。您的其余答案和评论是准确有效的。不需要感叹号。
    • 我坚持我写的东西。 Celery 无法停止其工作进程 - Python 进程 - 以最大限度地使用所有可用内核...只能由操作系统完成(例如,通过 taskset 工具) .
    • 是的,你是对的,但似乎 joblib 与 celery worker 进程不兼容(更具体地说是台球)...... joblib 仅在您将后端设置为 threading 时才有效。否则,它将强制 joblib 按照此(链接)使用 jobs=1[github.com/celery/celery/issues/4551#issuecomment-427325793]
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2014-07-26
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多