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

2024-05-23 17:15:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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%左右,以此类推

我希望每个子celery进程(通过prefork方法使用multiprocessing.Pool创建)将能够独立操作,而不受单个内核的约束。如果没有,我如何充分利用多个CPU核心来执行CPU限制的芹菜任务?在


Tags: 可执行文件task进程cpu内核充分利用runningcelery
1条回答
网友
1楼 · 发布于 2024-05-23 17:15:55

根据

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

存在这样一个问题:一些C扩展扰乱了核心亲和力,并阻止多进程访问所有可用的cpu。解决方案是一个彻底的黑客攻击,但似乎有效。在

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

相关问题 更多 >