【问题标题】:Python + Django + Celery has a very low publish speedPython + Django + Celery 的发布速度非常低
【发布时间】:2019-01-15 01:28:48
【问题描述】:

我的任务发布速度存在严重问题,我目前正在调试它,我认为这是 Celery 设置的问题。

我正在使用 Django、Celery 和 RabbitMQ。我有一个发送电子邮件的简单任务。此任务有效,但速度很慢。

例如,我想在一个循环中执行 10000 个简单的“test_print() 任务”,但发布的速度不能超过 23-24/s。在它轻松发布 1000+/s 之前。我在系统中完成的每一项任务都遇到了这个问题。自从我将代码移至 Djcelery(使用 Django 代码包装的 celery 项目)或在服务器上发生了某些更改(不太可能的选项)时,它可能已经发生了。这是我的设置。它正在使用rabbitmq服务器。

设置:

CELERY_BROKER_POOL_LIMIT=0
CELERY_CELERYD_PREFETCH_MULTIPLIER=1
CELERY_BROKER_CONNECTION_TIMEOUT=20
CELERY_BROKER_CONNECTION_RETRY=True
CELERY_BROKER_CONNECTION_MAX_RETRIES=100
CELERY_BROKER_HEARTBEAT=10
CELERY_TASK_SEND_SENT_EVENT =True
CELERY_CELERYD_SEND_EVENTS  =True
CELERY_RESULT_BACKEND='rpc://'
CELERY_CELERYD_MAX_TASKS_PER_CHILD=500
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'


CELERY_TASK_ROUTES= {
    'parse_x.*': {
        'queue': 'parse_x',
        'routing_key': 'parse_x',
        },...
}

任务:

@shared_task(name="solicitor_tracker.test_print")
def test_print(i):
    print(i)
    time.sleep(0.1)


@shared_task(name="setup_queue.test_print_task_setup_queue",acks_late=False, 
autoretry_for=(Exception,), retry_backoff=True)
def redirection_check_setup_queue():
    for i in range(0,100000):
        test_print.apply_async([i],queue="lawsociety_parse")

【问题讨论】:

  • 你确定这不是这段代码time.sleep(0.1)造成的吗?
  • 不是,只是调试的测试任务,不是执行时间问题,而是消息发布慢
  • 但是你刚刚说你是 23/s 发布的?可能是由于延迟造成的吗?并且执行时间比打印最后一条消息要早得多?

标签: django rabbitmq celery django-celery djcelery


【解决方案1】:

问题解决了。致命的设置是 broker_pool_limit=0,它在发布后重置连接。将其设置为默认值(10)后,每秒达到 500-1000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2020-02-11
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2013-11-02
    相关资源
    最近更新 更多