任务是一条消息,“周期性任务”会定期发送任务消息。每个发送的任务都将分配一个唯一的 ID。
revoke 只会取消单个任务消息。要获取您必须保留的任务的 ID
跟踪发送的 id,但您也可以在发送任务时指定自定义 id。
我不确定您是要取消单个任务消息,还是要停止周期性任务发送更多消息,所以我将列出两者的答案。
没有内置的方法来保存与周期性任务一起发送的任务的 id,
但是您可以将每个任务的 id 设置为周期性任务的名称,这样
id 将引用与周期性任务一起发送的任何任务(通常是最后一个)。
您可以通过这种方式指定自定义 id,
使用 @periodic_task 装饰器:
@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
pass
或使用CELERYBEAT_SCHEDULE 设置:
CELERYBEAT_SCHEDULE = {name: {"task": task_name,
"options": {"task_id": name}}}
如果您想删除周期性任务,您只需从代码库中删除 @periodic_task,或从 CELERYBEAT_SCHEDULE 中删除条目。
如果您使用的是 Django 数据库调度程序,则必须删除周期性任务
从 Django 管理界面。
PS1:revoke 不会停止已经开始的任务。它只会取消
尚未开始的任务。您可以使用终止正在运行的任务
revoke(task_id, terminate=True)。默认情况下,这会将TERM 信号发送到
该过程,如果您想发送另一个信号(例如 KILL),请使用
revoke(task_id, terminate=True, signal="KILL").
PS2:revoke 是一个远程控制命令,所以它只被 RabbitMQ 支持
和 Redis 代理传输。
如果您希望您的任务支持取消,您应该通过存储 cancelled 来实现
在数据库中标记并让任务在启动时检查该标记:
from celery.task import Task
class RevokeableTask(Task):
"""Task that can be revoked.
Example usage:
@task(base=RevokeableTask)
def mytask():
pass
"""
def __call__(self, *args, **kwargs):
if revoke_flag_set_in_db_for(self.request.id):
return
super(RevokeableTask, self).__call__(*args, **kwargs)