Warm tip: This article is reproduced from serverfault.com, please click

python-如果相关对象不存在,则撤消已排队的任务

(python - Revoke a queued task if the related object does not exist)

发布于 2020-12-03 08:47:01

我想删除创建对象时触发的排队任务(使用Celery)。如果要在事件发生前5分钟触发任务并且该对象已被删除,则保留排队的消息。

task.py

@app.task
def send_notification(abc):
    # do some stuff with abc
    # return something

models.py

class ABC(models.Model):
    description = models.TextField()

views.py

def abc(request):
    # create the ABC object
    send_after=timezone.now() + timedelta(minutes=5)
    send_notification.apply_async(eta=send_after)
    # return something

因此,当在创建对象ABC之后立即删除该对象ABC时,相关的排队消息也应被吊销。

关于如何处理这个想法吗?

Questioner
twingo
Viewed
0
twingo 2020-12-06 05:59:02

我通过将对象ID传递给任务而不是对象来解决此问题,因此在任务中增加了一行:

@app.task
def send_notification(abc_id):
    try:
        abc_obj = ABC.objects.get(id=abc_id)
    except ObjectDoesnotExist:
        return

    # do some stuff with abc
    # return something