Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用芹菜取消已经执行的任务?_Python_Django_Celery_Message Passing - Fatal编程技术网

Python 用芹菜取消已经执行的任务?

Python 用芹菜取消已经执行的任务?,python,django,celery,message-passing,Python,Django,Celery,Message Passing,我一直在阅读文档并搜索,但似乎找不到一个直截了当的答案: 是否可以取消已执行的任务?(如中所示,任务已开始,需要一段时间,中途需要取消) 我从医生那里找到的 但我不清楚这是否会取消排队的任务,或者是否会终止工作进程上正在运行的进程。谢谢你能给我带来的一切 有关任务,请参见以下选项:,(也可以为工作人员设置)。如果您不仅想控制执行时间,还想查看apply_async method的参数。revoke取消任务执行。如果任务被撤销,工作人员将忽略该任务而不执行它。如果不使用持久撤销,则可以在工作进程重

我一直在阅读文档并搜索,但似乎找不到一个直截了当的答案:

是否可以取消已执行的任务?(如中所示,任务已开始,需要一段时间,中途需要取消)

我从医生那里找到的


但我不清楚这是否会取消排队的任务,或者是否会终止工作进程上正在运行的进程。谢谢你能给我带来的一切

有关任务,请参见以下选项:,(也可以为工作人员设置)。如果您不仅想控制执行时间,还想查看apply_async method的参数。

revoke取消任务执行。如果任务被撤销,工作人员将忽略该任务而不执行它。如果不使用持久撤销,则可以在工作进程重新启动后执行任务

revoke有一个终止选项,默认为False。如果需要终止正在执行的任务,则需要将terminate设置为True

在芹菜3.1中,更改了

根据,您应该使用result.revoke:

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
或者,如果您只有任务id:

>>> from proj.celery import app
>>> app.control.revoke(task_id)

@0x00mh的答案是正确的,但是最近芹菜公司说使用
终止
选项是“管理员的最后手段”,因为您可能会意外终止同时开始执行的另一个任务。可能更好的解决方案是将
terminate=True
signal='SIGUSR1'
相结合(这会导致在任务中引发SoftTimeLimitExceeded异常)。

此外,不满意的是,还有另一种方法(中止任务)来停止任务,但存在许多不可靠性,更多详细信息,请参阅:

这正是我想要的解释,谢谢!这在分布式环境中有效吗?我的意思是,如果我有工人在多台机器上执行任务。芹菜跟踪任务在哪台机器上执行吗?它跟踪。与工作人员的通信是通过broker.result.revoke(terminate=True)进行的。根据最近的芹菜文档,revoke(task_id,terminate=True)应该执行与revoke相同的操作,使用terminate选项是“管理员的最后手段”。您可能会终止该工作人员最近开始的另一项任务。此解决方案对我非常有效。当在我的任务中引发
SoftTimeLimitExceeded
时,将调用我的自定义清理逻辑(通过
try
/
实现,但最后
/
除外)。在我看来,这比
AbortableTask
提供的功能要好得多()。对于后者,您需要一个数据库结果后端,您必须手动并反复检查正在进行的任务的状态,以查看它是否已被中止。这样做更好吗?据我所知,如果进程拾取了任何其他任务,它无论如何都将被停止,只会引发不同的异常。如果我使用
worker\u prefetch\u multiplier=1
,因为我只有几个长时间运行的任务,终止应该是可以的-因为终止不会影响其他任务-我的回答正确吗@蜘蛛拉面
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
>>> from proj.celery import app
>>> app.control.revoke(task_id)