手动返回芹菜任务的错误结果和状态失败?

时间:2014-03-17 05:38:04

标签: python celery

我已经创建了芹菜任务来运行一些通过nodejs用javascript编写的各种工作。该任务基本上是subprocess.popen,它调用nodejs。

nodejs作业在退出时将返回非零状态,以及写入stderr的错误信息。

当发生这种情况时,我想采取stderr,并将其作为“结果”返回给芹菜,以及FAILURE状态,这样我的工作监视器就可以反映作业失败。

我该怎么做?

这是我的任务

@app.task
def badcommand():
    try:
       output = subprocess.check_output('ls foobar',stderr=subprocess.STDOUT,shell=True)
       return output
    except subprocess.CalledProcessError as er:
       #What do I do here to return er.output, and set the status to fail?

如果我没有捕获子进程异常,则Job正确失败,但结果为空,我得到了一个回溯堆栈跟踪。

如果我发现异常,并返回er.output作业成功完成。

2 个答案:

答案 0 :(得分:5)

您可以使用celery.app.task.Task.update_state方法更新当前任务状态。

@app.task(bind=True)
def badcommand(self):
    try:
       output = subprocess.check_output('ls foobar',stderr=subprocess.STDOUT,shell=True)
       return output
    except subprocess.CalledProcessError as er:
        self.update_state(state='FAILURE', meta={'exc': er})

请注意,app.task装饰器的bind参数是在Celery 3.1中引入的。如果您仍在使用旧版本,我想想您可以通过这种方式调用update_state任务方法:

@app.task
def badcommand():
    ...
    except subprocess.CalledProcessError as er:
        badcommand.update_state(state='FAILURE', meta={'exc': er})    

答案 1 :(得分:3)

您可以使用具有指定功能的基础,以便在失败时执行操作。

class YourBase(Task):
    def on_success(self, retval, task_id, args, kwargs):
        print "Failure"

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print "Success"

@app.task(base=YourBase)
def badcommand():
   output = subprocess.check_output('ls foobar', stderr=subprocess.STDOUT, shell=True)
   return output

这些是您的基类可以使用的处理程序:http://celery.readthedocs.org/en/latest/userguide/tasks.html#handlers