Как убить задачу сельдерея

tasks.py

@task
def daterange():
    import datetime
    some = Poll.objects.all()
    schedule = Schedule.objects.all()
    for c in schedule :
        p = c.poll
        e = c.end_time
        s = c.start_time
        n = int(c.no_of_response)
        ph = Response.objects.filter(poll = p).exclude(sid = 'Null').count()
        now = timezone.now()
        if (c.start_time <= now) & (now <= c.end_time):
            if (n == 0) | (n > ph):
                c.poll.status='Running'
                c.poll.save()
            elif(n == ph):
                c.poll.status='Complete'
                c.poll.save()
                #time.sleep(1000)
            else:
                c.poll.status='Out of Bound'
                c.poll.save()
        elif c.end_time < now:
            c.poll.status='Complete'
            c.poll.save()
        elif c.start_time > now:
            c.poll.status='New'
            c.poll.save()

models.py

class Schedule(models.Model):
        poll = models.ForeignKey(Poll, on_delete=models.CASCADE)
        start_time = models.DateTimeField() 
        end_time = models.DateTimeField() 
        no_of_response = models.IntegerField(default = 0)

Я запланировал задачу запуска сельдерея каждые 10 секунд. Периодическая задача, включая код для обновления опроса в соответствии с временем начала и окончания. Если опрос проходит между временем начала и временем окончания, тогда обновите статус опроса до рабочего. Если статус в данный момент запущен, то как остановить опрос, когда наступит время окончания. Как убить задачу сельдерея в этом проекте?

1 ответ

Повторите задачу до успешного выполнения. Пример возможной реализации:

from celery import current_task

# decorator to retry task
def retry_if_false(func):
    @functools.wraps(func)
    def wrapped(*args, **kwargs):
        if not func(*args, **kwargs):
           current_task.retry()
    return wrapped

 @retry_if_false
 @task
 def daterange():
     ..<your code>..
     return c.poll.status == 'Complete'  # return True if polling finished.

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

Другие вопросы по тегам