我有一个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%左右,以此类推
我希望每个子celery进程(通过prefork方法使用multiprocessing.Pool
创建)将能够独立操作,而不受单个内核的约束。如果没有,我如何充分利用多个CPU核心来执行CPU限制的芹菜任务?在
根据
http://bugs.python.org/issue17038 和 https://stackoverflow.com/a/15641148/519385
存在这样一个问题:一些C扩展扰乱了核心亲和力,并阻止多进程访问所有可用的cpu。解决方案是一个彻底的黑客攻击,但似乎有效。在
os.system("taskset -p 0xff %d" % os.getpid())
相关问题 更多 >
编程相关推荐