我已经创建了芹菜任务来运行一些通过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
作业成功完成。
答案 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