セロリ キューのすべてのタスクがサード パーティの API にヒットしているとします。ただし、API にはレート制限があり、私はそれを追跡しています (尊重する必要がある 1 日あたりの制限と 1 時間あたりの制限があります)。レート制限に達するとすぐに、新しいタスクの使用を一時停止し、問題がないことがわかったら再開したいと考えています。
次の2つのタスクを使用してこれを達成しました。
@celery.task()
def cancel_api_queue(minutes_to_resume):
resume_api_queue.apply_async(countdown=minutes_to_resume*60, queue='celery')
celery.control.cancel_consumer('third_party', reply=True)
@celery.task(default_retry_delay=300, max_retries=5)
def resume_api_queue():
celery.control.add_consumer('third_party', destination=['y@local'])
その後、サードパーティの API タスクを送信し続けることができ、コンシューマーが追加されるとすぐに、すべてのタスクが消費されます。偉大な。
ただし、このキューにはコンシューマーがいないため、 Flowerで送信されているジョブを(コンシューマーが追加されるまで)見ることができないようです。
私が間違っていることはありますか?この「一時停止」を別の方法で実行して、送信されたジョブが引き続き表示されるようにすることはできますか?
PSおそらくこれはこの問題に関連していますが、100%確実ではありません:https://github.com/celery/celery/issues/1452
それが違いを生む場合、私はamqpブローカーを使用しています。
女の子と男の子に感謝します。