実行中に特定のタスクの設定を変更するように celerybeat に指示する方法はありますか?
これの有用性は、次の例で最もよく説明されています。
30 秒ごとに値をチェックする定期的なタスクがあります。場合によっては、外部トリガー (予測できない) に基づいて、このタスクのポーリング頻度を 10 秒 (数分間) に増やしたいことがあります。
これは管理可能な方法で実行できますか? タスク構成を変更してセロリをリロードできることは知っていますが、それは面倒な方法のようです...
実行中に特定のタスクの設定を変更するように celerybeat に指示する方法はありますか?
これの有用性は、次の例で最もよく説明されています。
30 秒ごとに値をチェックする定期的なタスクがあります。場合によっては、外部トリガー (予測できない) に基づいて、このタスクのポーリング頻度を 10 秒 (数分間) に増やしたいことがあります。
これは管理可能な方法で実行できますか? タスク構成を変更してセロリをリロードできることは知っていますが、それは面倒な方法のようです...
schedules.py モジュールには、次のようなものがあります。
class schedule(object):
def is_due(self, last_run_at):
"""Returns tuple of two items `(is_due, next_time_to_run)`,
where next time to run is in seconds.
e.g.
* `(True, 20)`, means the task should be run now, and the next
time to run is in 20 seconds.
* `(False, 12)`, means the task should be run in 12 seconds.
You can override this to decide the interval at runtime,
but keep in mind the value of :setting:`CELERYBEAT_MAX_LOOP_INTERVAL`,
which decides the maximum number of seconds celerybeat can sleep
between re-checking the periodic task intervals. So if you
dynamically change the next run at value, and the max interval is
set to 5 minutes, it will take 5 minutes for the change to take
effect, so you may consider lowering the value of
:setting:`CELERYBEAT_MAX_LOOP_INTERVAL` if responsiveness is of
importance to you.
.. admonition:: Scheduler max interval variance
The default max loop interval may vary for different schedulers.
For the default scheduler the value is 5 minutes, but for e.g.
the django-celery database scheduler the value is 5 seconds.
"""
last_run_at = self.maybe_make_aware(last_run_at)
rem_delta = self.remaining_estimate(last_run_at)
rem = timedelta_seconds(rem_delta)
if rem == 0:
return True, self.seconds
return False, rem
したがって、is_due メソッドをオーバーライドして、独自の timedelta を設定できます。