Django/芹菜-如何杀死芹菜任务?

Django/芹菜-如何杀死芹菜任务?,django,celery,Django,Celery,我使用Django和芹菜来完成一个异步任务。我需要知道如何正确地杀死芹菜 例如,我在Django视图中有一个芹菜任务: ... sometask.delay(some1, some2) ... 要杀死这个“sometask”,我可以在任务中使用sys.exit()?例如: @shared_task def sometask(some1, some2): ... ... if some1 == False: sys.exit('Abort!') 这个sy

我使用Django和芹菜来完成一个异步任务。我需要知道如何正确地杀死芹菜

例如,我在Django视图中有一个芹菜任务:

...
sometask.delay(some1, some2)
...
要杀死这个“sometask”,我可以在任务中使用sys.exit()?例如:

@shared_task
def sometask(some1, some2):
    ...
    ...
    if some1 == False:
        sys.exit('Abort!')
这个sys.exit()将在芹菜任务中工作


向您致意,

您提到了“杀死芹菜任务”,您还提到了
sys.exit()
。 通常,终止进程需要一些外部干扰来终止进程。使用
sys.exit()

考虑到这一点,这里有几个选项:

  • 如果希望芹菜任务结束:只需从函数(sometask)返回,任务就会结束。如果您无一例外地返回,任务将被视为成功。如果引发异常,则该任务将被视为失败。无论哪种方式,任务都会结束,除非您有重试的逻辑。请注意,执行任务的池工作进程可能仍然处于活动状态,具体取决于工作节点的
    maxtasksperchild
    参数
  • 如果要从流程外部结束芹菜任务,请执行以下操作:

    a) 如果您知道taskid,则可以尝试撤消该任务

    b) 如果您想“杀死”(术语)正在执行任务的工作进程,那么这是另一回事。你需要处理相关的信号。我认为一个术语信号只发送给主工作进程,而不是池工作进程。这就是我记得的,因为我试图解决一个类似的问题

  • 从您尝试在代码中使用
    sys.exit()
    的方式来看,我认为#1就是您所需要的一切。

    来自:

    当工作程序收到撤销请求时,它将跳过执行 任务,但它不会终止已执行的任务,除非设置了terminate选项

    如果设置了terminate,则工人子进程 将终止对任务的处理

    使用
    app.control.revoke(task\u id,terninate=True)
    ,这将终止工作进程的子进程,所有其他任务都将正常

    在这里,我开始两项任务并终止其中一项:

    app.control.revoke("c028bd99-8394-4e2c-86ab-440ca2290d67",terninate=True)
    [2015-11-19 04:55:09,458: INFO/MainProcess] Received task: celery.starmap[73c53773-2dd5-40d0-b9a0-83b2f12eba9b]
    [2015-11-19 04:55:09,465: INFO/MainProcess] Received task: celery.starmap[c028bd99-8394-4e2c-86ab-440ca2290d67]
    [2015-11-19 04:57:13,993: INFO/MainProcess] Tasks flagged as revoked: c028bd99-8394-4e2c-86ab-440ca2290d67
    [2015-11-19 04:59:32,684: INFO/MainProcess] Terminating c028bd99-8394-4e2c-86ab-440ca2290d67 (15)
    [2015-11-19 04:59:32,781: ERROR/MainProcess] Task celery.starmap[c028bd99-8394-4e2c-86ab-440ca2290d67] raised unexpected: Terminated(15,)
    Traceback (most recent call last):
          File "....../lib/python2.7/site-packages/billiard/pool.py", line 1678, in _set_terminated
            raise Terminated(-(signum or 0))
        Terminated: 15
    

    如果您只想停止任务运行,则task.revoke()可能不需要sys.exit()。打电话到那里就可以了。这对我没有影响。