使用celery任务调用子进程的CPU并发行为

时间:2014-05-08 21:01:20

标签: python concurrency multiprocessing celery

我有一个celery任务,它使用subprocess.Popen()来调用可执行文件来执行一些CPU密集型数据处理。它运作良好,但没有充分利用芹菜工人的并发性。

如果我使用--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:

enter image description here

如果我再添加两个任务,每个子进程占用一个CPU的约20%等等。

我希望每个子芹菜过程(通过prefork方法使用multiprocessing.Pool创建)将能够独立运行,而不是限制在单个核心。如果没有,我怎样才能充分利用具有CPU限制的芹菜任务的多个CPU内核?

1 个答案:

答案 0 :(得分:2)

根据

http://bugs.python.org/issue17038https://stackoverflow.com/a/15641148/519385

存在一个问题,即某些C扩展会破坏核心关联,并阻止多处理访问所有可用的CPU。解决方案是一个彻底的黑客,但似乎工作。

os.system("taskset -p 0xff %d" % os.getpid())