Django и Celery. Удаление задачи и создание новой
Суть в том, что мне нужно создавать задачу, НО, если эта задача уже была ранее создана, но не успела выполнится, то мы ее отменяем, и создаем заново!
Делал вот так, но existing_task = AsyncResult(task_id)
возвращает PENDING
даже если такой задачи не существует, из-за этого постоянно все задачи отменяются.
class Post(models.Model):
"""Модель постов"""
STATES = (
('draft', 'Черновик'),
('published', 'Опубликовано'),
('planned', 'Запланировано')
)
state = models.CharField(choices=STATES, default=STATES[0][0])
channels = models.ManyToManyField('channel.Channel')
creator = models.ForeignKey('authentication.User', on_delete=models.SET_NULL, null=True)
publish_date = models.DateTimeField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
@receiver(post_save, sender=Post)
def schedule_post(sender, instance, **kwargs):
"""Планирование задачи для отправки поста"""
if instance.state == 'planned':
task_id = f'post_{instance.id}'
existing_task = AsyncResult(task_id)
if existing_task.state == 'PENDING':
app.control.revoke(task_id, terminate=True)
print(f'Old task {task_id} revoked and will be recreated.')
publish_time = instance.publish_date
if not is_aware(publish_time):
publish_time = make_aware(publish_time)
if (publish_time + timedelta(seconds=5)) >= make_aware(datetime.utcnow()):
send_post.apply_async((instance.id,), eta=publish_time, task_id=task_id)
else:
instance.state = 'draft'
instance.save(update_fields=['state'])
И да, хоть я отменяю задачу выше, а ниже создаю новую, то все равно она отменяется