pythondjangocelerymessage-passing

Cancel an already executing task with Celery?


I have been reading the doc and searching but cannot seem to find a straight answer:

Can you cancel an already executing task? (as in the task has started, takes a while, and half way through it needs to be cancelled)

I found this from the doc at Celery FAQ

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

But I am unclear if this will cancel queued tasks or if it will kill a running process on a worker. Thanks for any light you can shed!


Solution

  • revoke cancels the task execution. If a task is revoked, the workers ignore the task and do not execute it. If you don't use persistent revokes your task can be executed after worker's restart.

    https://docs.celeryq.dev/en/stable/userguide/workers.html#worker-persistent-revokes

    revoke has an terminate option which is False by default. If you need to kill the executing task you need to set terminate to True.

    >>> from celery.task.control import revoke
    >>> revoke(task_id, terminate=True)
    

    https://docs.celeryq.dev/en/stable/userguide/workers.html#revoke-revoking-tasks