Как мы выполнили задачи остановки в сельдерее period_task? - PullRequest
0 голосов
/ 17 сентября 2018

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

сельдерееподобный рабочие-экран

[2018-09-17 12:23:50,864: INFO/MainProcess] Received task: cimexapp.tasks.add[xxxxxxx]<br> [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]<br> [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]<br> [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 ПРОЕКТНОЕ УПРАВЛЕНИЕ выключением

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

1 Ответ

0 голосов
/ 20 сентября 2018

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

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

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

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

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

    task = PeriodicTask.objects.get(name='task_name')
    task.enabled = False
    task.save()
...