【问题标题】:Django Celery reduce time, 5 hours to complete 1000 tasksDjango Celery 减少时间,5小时完成1000个任务
【发布时间】:2013-03-06 22:41:04
【问题描述】:

我在开发环境中运行,所以这在生产中可能有所不同,但是当我从 Django Celery 运行任务时,它似乎每 10-20 秒才从代理获取任务。我现在只是在测试,但假设我要发送大约 1000 个任务,这意味着需要 5 多个小时才能完成。

这正常吗?它应该更快吗?还是我做错了什么?

这是我的任务

class SendMessage(Task):
    name = "Sending SMS"
    max_retries = 10
    default_retry_delay = 3

    def run(self, message_id, gateway_id=None, **kwargs):
        logging.debug("About to send a message.")

        # Because we don't always have control over transactions
        # in our calling code, we will retry up to 10 times, every 3
        # seconds, in order to try to allow for the commit to the database
        # to finish. That gives the server 30 seconds to write all of
        # the data to the database, and finish the view.
        try:
            message = Message.objects.get(pk=message_id)
        except Exception as exc:
            raise SendMessage.retry(exc=exc)

        if not gateway_id:
            if hasattr(message.billee, 'sms_gateway'):
                gateway = message.billee.sms_gateway
            else:
                gateway = Gateway.objects.all()[0]
        else:
            gateway = Gateway.objects.get(pk=gateway_id)

        #response = gateway._send(message)
        print(message_id)

        logging.debug("Done sending message.")

从我的角度来看

 for e in Contact.objects.filter(contact_owner=request.user etc etc):
            SendMessage.delay(e.id, message)

【问题讨论】:

  • 你用什么Broker来发送任务?没有 celery 执行单个任务需要多长时间?
  • 你的后端是什么?您正在使用什么日志记录处理程序?你是如何推出 celery 的?
  • @JeffS 我正在使用 Amazon SQS。
  • @Rob 我正在使用命令“python manage.py celery worker --loglevel=info”通过终端运行 Celery,因为这只是我的测试。
  • @Spike 我很想知道 SendMessage.run() 从 django shell 需要多长时间

标签: django django-celery


【解决方案1】:

是的,这很正常。这是要使用的默认工作人员。他们设置了这个默认值,这样它就不会影响应用程序的性能。

还有另一种方法可以改变它。任务装饰器可以采用许多选项来改变任务的行为方式。任何传递给任务装饰器的关键字参数实际上都会被设置为结果任务类的属性。

您可以设置速率限制,以限制在给定时间范围内可以运行的任务数量。

//means hundred tasks a minute, another /s (second) and /h (hour)
CELERY_DEFAULT_RATE_LIMIT = "100/m" --> set in settings

【讨论】:

  • 感谢 Catherine,那么开箱即用的实际默认设置是什么?对于小型 EC2 实例,您会推荐什么作为良好的速率限制?
  • 每 24 小时 1,000 条消息,最大速率为每秒一条消息。设置速率限制时,还要设置CELERY_DISABLE_RATE_LIMITS = False
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2020-12-26
  • 1970-01-01
  • 2013-08-13
相关资源
最近更新 更多