Как убить задачу сельдерея
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.
Теперь вы можете начать свою задачу как обычную задачу, не нужно добавлять ее в список сельдерея.