6

5 秒間隔で実行される単一の celerybeat スケジュール タスクを持つセロリ ワーカーを作成しました。セロリワーカーを停止せずに別のビートタスクを動的に追加するにはどうすればよいですか?

app.conf.update(
   CELERY_TASK_RESULT_EXPIRES=3600,
   CELERY_TIMEZONE = 'UTC',
   CELERYBEAT_SCHEDULE = {
    'long-run-5-secs': {
        'task': 'test_proj.tasks.test',
        'schedule': timedelta(seconds=5),
        'args': (16, )
    }
   }
)

上記の構成で、ビート モードでセロリ ワーカーを正常に実行できます。

ここで、以下のビート スケジュールを動的に追加する必要があります。

'long-run-2-secs': {
    'task': 'test_proj.tasks.test',
    'schedule': timedelta(seconds=2),
    'args': (14, ) },

ありがとう

4

2 に答える 2

1

私はまったく同じ問題の解決策を探していました。Celery ver.4.0 までお待ちください。動的タスク スケジューリングは現在、開発バージョンでのみサポートされています: http://docs.celeryproject.org/en/master/userguide/periodic-tasks.html#beat-entries

于 2016-05-20T09:38:29.550 に答える
0

考えられる 1 つの方法は、タスクをデータベースに保存し、削除タスクを動的に追加することです。同じために、データベースでバックアップされたセロリビートスケジューラを使用できます。https://django-celery-beat.readthedocs.io/en/latest/を参照してください。PeriodicTask データベースには、定期的なタスクが格納されます。データベース コマンド (Django ORM) を使用して定期的なタスクを操作できます。

これが私が動的タスクを処理した方法です(タスクを動的に作成および停止します)。

from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule

chon_schedule = CrontabSchedule.objects.create(minute='40', hour='08', day_of_week='*', day_of_month='*', month_of_year='*') # To create a cron schedule. 
schedule = IntervalSchedule.objects.create(every=10, period=IntervalSchedule.SECONDS) # To create a schedule to run everu 10 min.
PeriodicTask.objects.create(crontab=chon_schedule, name='name_to_identify_task',task='name_of_task') # It creates a entry in the database describing that periodic task (With cron schedule).
task = PeriodicTask.objects.create(interval=schedule, name='run for every 10 min', task='for_each_ten_min', ) # It creates a periodic task with interval schedule

PeriodicTask を更新するたびに、このテーブルのカウンターもインクリメントされ、データベースからスケジュールをリロードするようセロリ ビート サービスに指示します。

したがって、ビートを再起動したり、ビートを強制終了したりする必要はありません。特定の基準が満たされたときにタスクを停止する場合は、

periodic_task = PeriodicTask.objects.get(name='run for every 10 min')
periodic_task.enabled = False
periodic_task.save()

enabled が False の場合、定期的なタスクはアイドル状態になります。にすることで再びアクティブにすることができますenable = True

タスクが不要になった場合は、単にエントリを削除できます。

于 2018-11-28T07:10:09.930 に答える