2

私は開発環境で実行しているので、これは本番環境では異なる可能性がありますが、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)
4

1 に答える 1

5

はい、これは正常です。これは、使用されるデフォルトのワーカーです。アプリのパフォーマンスに影響を与えないように、このデフォルトを設定しました。

それを変更する別の方法があります。タスクデコレータは、タスクの動作を変更するいくつかのオプションを選択できます。タスクデコレータに渡されるキーワード引数は、実際には結果のタスククラスの属性として設定されます。

特定の時間枠で実行できるタスクの数を制限するレート制限を設定できます。

//means hundred tasks a minute, another /s (second) and /h (hour)
CELERY_DEFAULT_RATE_LIMIT = "100/m" --> set in settings
于 2013-03-18T15:32:12.127 に答える