Как мы выполнили стоп-задачи в celery Period_Task?

Отзыв задачи на @periodic_task отправляет Discarding revoked tasks & Due task to workers.

скриншот celery-workers

[2018-09-17 12:23:50,864: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
[2018-09-17 12:23:50,864: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx] [2018-09-17 12:24:00,865: INFO/Beat] Scheduler: Sending due task cimexapp.tasks.add (cimexapp.tasks.add) [2018-09-17 12:24:00,869: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
[2018-09-17 12:24:00,869: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx] [2018-09-17 12:24:10,865: INFO/Beat] Scheduler: Sending due task cimexapp.tasks.add (cimexapp.tasks.add) [2018-09-17 12:24:10,868: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]
[2018-09-17 12:24:10,869: INFO/MainProcess] Discarding revoked task: cimexapp.tasks.add[xxxxxxx]


tasks.py

@periodic_task(run_every=timedelta(seconds=10),options={"task_id":"xxxxxxx"})
def add():
     call(["ping","-c10","google.com"])


def stop():
    x = revoke("xxxxxxx",terminate=True,signal="KILL")
    print(x)
    print('DONE')

Я создал task_id с именем, чтобы мне было легко убить его, вызвав id.

Как полностью запретить отправку задач? Я не хочу убивать всех рабочих с

  • pkill -9 -f 'сельдерейный работник'
  • сельдерей -A PROJECTNAME управление отключением

  • Я просто хочу остановить задачи/работники для функции add().

person Arbazz Hussain    schedule 17.09.2018    source источник
comment
django-celery-beat.readthedocs.io /ru/последние/   -  person Shubham Agrawal    schedule 19.12.2019


Ответы (2)


Один из возможных способов — хранить задачи в базе данных и динамически добавлять задачи удаления. Для этого вы можете использовать планировщик ударов сельдерея на основе базы данных. См. 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, счетчик в этой таблице также увеличивается, что указывает службе celery beat перезагружать расписание из базы данных.

Так что вам не нужно перезапускать или убивать бит. Если вы хотите остановить задачу, когда выполняются определенные критерии, тогда

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

Если для параметра включено значение False, периодическая задача становится бездействующей. Вы можете снова сделать его активным, сделав enable = True.

Если вам больше не нужна задача, вы можете просто удалить запись.

При создании объекта модели проекта также создайте периодическую задачу. Просто создайте расписание cron или интервальное расписание на основе вашего сценария. Затем создайте объект PeriodicTask, вы можете дать имя от Project.name до PeriodicTask (чтобы вы могли легко связать объект проекта с объектом PeriodicTask. Вот и все, с этого момента задача будет обрабатываться celery beat.

Если вы хотите отключить или включить периодическую задачу динамически, просто установите флаг «включено» в PeriodicTask следующим образом.

    task = PeriodicTask.objects.get(name='task_name')
    task.enabled = False
    task.save()
person a_k_v    schedule 20.09.2018

В Celery 4.2.2 вы можете удалить все задачи ритма, выполнив следующую команду

celery -A YourProjectName purge

Не забудьте заменить YourProjectName. Для получения дополнительной информации посетите эту страницу.

person Kyamasam    schedule 17.04.2020