【发布时间】:2013-09-21 13:30:05
【问题描述】:
我正在尝试发送约 400 个 HTTP GET 请求并收集结果。 我正在从 django 运行。 我的解决方案是在 gevent 中使用 celery。
要开始我调用 get_reports 的 celery 任务:
def get_reports(self, clients, *args, **kw):
sub_tasks = []
for client in clients:
s = self.get_report_task.s(self, client, *args, **kw).set(queue='io_bound')
sub_tasks.append(s)
res = celery.group(*sub_tasks)()
reports = res.get(timeout=30, interval=0.001)
return reports
@celery.task
def get_report_task(self, client, *args, **kw):
report = send_http_request(...)
return report
我使用 4 个工人:
manage celery worker -P gevent --concurrency=100 -n a0 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a1 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a2 -Q io_bound
manage celery worker -P gevent --concurrency=100 -n a3 -Q io_bound
我使用 RabbitMq 作为代理。
虽然它比顺序运行请求快得多(400 个请求大约需要 23 秒),但我注意到大部分时间都是 celery 本身的开销,即如果我像这样更改 get_report_task :
@celery.task
def get_report_task(self, client, *args, **kw):
return []
整个操作耗时约 19 秒。 这意味着我只花了 19 秒将所有任务发送到 celery 并返回结果
到rabbit mq的消息排队率似乎是28条消息/秒,我认为这是我的瓶颈。
如果这很重要,我正在一台 win 8 机器上运行。
我尝试过的一些事情:
- 使用 redis 作为代理
- 使用redis作为结果后端
-
调整这些设置
BROKER_POOL_LIMIT = 500
CELERYD_PREFETCH_MULTIPLIER = 0
CELERYD_MAX_TASKS_PER_CHILD = 100
CELERY_ACKS_LATE = 假
CELERY_DISABLE_RATE_LIMITS = 真
我正在寻找任何有助于加快速度的建议。
【问题讨论】:
-
嘿!每秒 28 条消息的发布速度非常低。我已经看到 celery+librabbitmq 在我的台式电脑上使用非持久消息每秒执行 100.000 个任务。你真的只衡量发送消息,还是衡量返回结果? Redis reusult 后端未针对 RPC 进行优化。开发版本(将是 Celery 3.1)中有一个新的 RPC 结果后端,它对此更好。
标签: python django performance rabbitmq celery