【问题标题】:CPU Concurrency behavior with celery task that calls a subprocess调用子进程的 celery 任务的 CPU 并发行为
【发布时间】: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


    【解决方案1】:

    根据

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-20
      • 2016-03-31
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多