Python 如何杀死芹菜任务子进程,并仍然获得正确的任务状态?

Python 如何杀死芹菜任务子进程,并仍然获得正确的任务状态?,python,task,celery,Python,Task,Celery,我使用芹菜与Redis结果后端和RabbitMQ代理。我有一个长时间运行的任务包装在一个shell脚本中(该脚本反过来调用执行繁重任务的程序)。我希望能够从“外部”终止子进程,但仍然使用芹菜的默认任务状态 我的任务如下所示: @app.task(bind=True,base=AbortableTask) def my_任务(self、shellscrippt_包装器_命令): proc=subprocess.Popen(“exec”+shellscript\u wrapper\u命令, stdo

我使用芹菜与Redis结果后端和RabbitMQ代理。我有一个长时间运行的任务包装在一个shell脚本中(该脚本反过来调用执行繁重任务的程序)。我希望能够从“外部”终止子进程,但仍然使用芹菜的默认任务状态

我的任务如下所示:

@app.task(bind=True,base=AbortableTask)
def my_任务(self、shellscrippt_包装器_命令):
proc=subprocess.Popen(“exec”+shellscript\u wrapper\u命令,
stdout=子流程.PIPE,
stderr=subprocess.STDOUT,
shell=True)
my_task.cancel_future_calls=反复调用(5,检查_abort_状态,self.request.id,proc)
return proc.wait()
辅助功能:


通过反复调用,我启动一个计时器,每五秒钟检查一次任务的状态

这是我的问题。如果我从外部中止任务(如使用
my_task.abort()
),助手函数
check_abort_state
将启动,检测中止状态,并终止长时间运行任务内的子进程。到现在为止,一直都还不错。但是,
my_task()
函数返回芹菜的任务成功,从而将状态设置为successful覆盖我在
check_abort_state
中设置的自己的FAILURE状态。在此之后,我不能再对任务的状态执行任何操作。它永远被设定为成功

有什么办法可以防止吗?我希望能够在长时间运行的任务中终止子进程,但保留我自己设置的任务状态

避免这种情况的一种方法是,不要执行
return proc.wait()
raise芹菜.exceptions.Ignore(),而是依次忽略所有任务状态,然后我甚至不会注意到任务何时成功:/

def check_abort_state(task_id, proc):
    result = my_task.AsyncResult(task_id)
    print("*** is aborted? {}, pid: {}".format(result.is_aborted(), proc.pid))
    if result.is_aborted():
        print("*** killing task {}".format(task_id))
        proc.kill()
        my_task.update_state(task_id=task_id, state='FAILURE')