【发布时间】:2014-06-26 11:26:35
【问题描述】:
我有一个 celery 任务,它使用 subprocess.Popen() 调用可执行一些 CPU 密集型数据处理的可执行文件。它运行良好,但没有充分利用 celery worker 的并发性。
如果我用--concurrency 8 -P prefork 启动celeryd,我可以用ps aux | grep celeryd 确认已经产生了8 个子进程。好的。
现在当我开始时,例如并行执行 3 个任务,我看到其中一名童工完成了所有三个任务:
[2014-05-08 13:41:23,839: WARNING/Worker-2] running task a...
[2014-05-08 13:41:23,839: WARNING/Worker-4] running task b...
[2014-05-08 13:41:24,661: WARNING/Worker-7] running task c...
... 在成功完成之前它们会运行几分钟。但是,当您观察那段时间的 CPU 使用率时,很明显,尽管有另一个空闲内核,但所有三个任务都共享同一个 CPU:
如果我再添加两个任务,每个子进程会占用该 CPU 的约 20%,以此类推。
我希望每个 celery 子进程(通过 prefork 方法使用multiprocessing.Pool 创建)能够独立运行,而不受限于单个核心。如果没有,我如何在 CPU 密集型 celery 任务中充分利用多个 CPU 内核?
【问题讨论】:
标签: python concurrency multiprocessing celery