如何使用Celery实现多处理池

时间:2014-11-22 16:10:27

标签: python multiprocessing celery

在python多处理中,我能够创建一个30个进程的多处理池来处理某些ID上的一些长期运行的等式。以下代码在8核计算机上生成30个进程,load_average永远不会超过2.0。事实上,30个消费者是一个限制,因为托管ID的postgresql数据库有32个内核的服务器,所以我知道如果我的数据库可以处理它,我可以产生更多的进程。

from multiprocessing import Pool
number_of_consumers = 30
pool = Pool(number_of_consumers)

我花时间设置Celery但无法重新创建30个进程。我认为设置并发性,例如-c 30将创建30个进程,但如果没有错,那意味着我有32个处理器,我打算使用哪个错误,因为我只有8个!另外,我看到load_average在8核机器上击中10.0是不好的..

[program:my_app]
command = /opt/apps/venv/my_app/bin/celery -A celery_conf.celeryapp worker -Q app_queue -n app_worker --concurrency=30 -l info

因此,在使用Celery时,如何在8核机器上重新创建30个进程?

修改:排除混乱

我认为在讨论Celery和Python Multiprocessing时,我会附上一张图片来说明我对服务器负载的困惑。我使用的服务器有8个核心。使用Python多处理并生成30个进程,附图中显示的负载平均值为0.22,意思是 - 如果我的linux知识对我有用 - 我的脚本使用一个核心来生成30个进程一个非常低的load_average。

load_average using python multiprocessing screenshot

我对芹菜中的--concurrency=30选项的理解是,它指示Celery将使用多少,而不是产生多少个进程。我是对的吗?有没有办法指示Celery使用2个核心,每个核心产生15个进程,总共有30个并发进程,这样我的服务器负载仍然很低?

1 个答案:

答案 0 :(得分:0)

芹菜工人包括:

  1. 消息使用者
  2. 工作人员池
  3. 消息使用者从代理获取任务并将它们发送给池中的worker。

    --concurrency-c参数指定该池中的数字进程,因此如果您使用默认的prefork池,那么您已经拥有30个进程使用--concurrency=30的游泳池,您可以通过查看工作人员输出启动时进行检查,它应该具有以下内容:

    concurrency: 30 (prefork)
    

    来自docs on concurrency的说明:

      

    进程数(多处理/ prefork池)

         

    更多的池流程通常会更好,但是有一个截止点,添加更多池流程会以负面方式影响性能。甚至有一些证据表明支持多个工作程序实例运行,可能比单个工作程序表现更好。例如,每个有10个池进程的3个工作者。您需要尝试找到最适合您的数字,因为这会因应用程序,工作量,任务运行时间和其他因素而异。

    如果您想启动多个工作线程实例,请查看celery multi,或使用celery worker手动启动它们。