我有一个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:
如果我再添加两个任务,每个子进程占用一个CPU的约20%等等。
我希望每个子芹菜过程(通过prefork方法使用multiprocessing.Pool
创建)将能够独立运行,而不是限制在单个核心。如果没有,我怎样才能充分利用具有CPU限制的芹菜任务的多个CPU内核?
答案 0 :(得分:2)
根据
http://bugs.python.org/issue17038 和 https://stackoverflow.com/a/15641148/519385
存在一个问题,即某些C扩展会破坏核心关联,并阻止多处理访问所有可用的CPU。解决方案是一个彻底的黑客,但似乎工作。
os.system("taskset -p 0xff %d" % os.getpid())