我刚刚开始使用Celery并对link_error处理有疑问。
这是我启动测试的方式:
res = tasks.p0.apply_async((1,2,3),link = tasks.p1.s(('AA')),link_error = tasks.p0_fail.s(id ='qwerty'))< / p>
并且,为了调试p0_fail,我在p0中生成了不同的异常。这是p0_fail的定义:
@app.task
def p0_fail(wtf, *args, **kwargs):
print("What the Failed's type is {}".format(type(wtf)))
result = app.AsyncResult(wtf)
print("Result type is {}".format(type(result)))
code = kwargs['id']
# exc = result.get(propagate=False, disable_sync_subtasks=False)
print("Task {0} (code '{4}') raised exception: {1!r}\n{2!r} and is in '{3}' state".format(
wtf.id, result.info, result.traceback, result.state, code))
print("result.id is {} (type {})".format(result.id, type(result.id)))
产生以下输出:
[2018-06-07 10:48:40,943: WARNING/ForkPoolWorker-2] p0 got exception: division by zero
[2018-06-07 10:48:40,965: WARNING/ForkPoolWorker-2] What the Failed's type is <class 'celery.app.task.Context'>
[2018-06-07 10:48:40,965: WARNING/ForkPoolWorker-2] Result type is <class 'celery.result.AsyncResult'>
[2018-06-07 10:48:40,970: WARNING/ForkPoolWorker-2] Task 03b009af-dc35-46c5-8216-a6868e66c9be (code 'qwerty') raised exception: None None and is in 'PENDING' state
[2018-06-07 10:48:40,970: WARNING/ForkPoolWorker-2] result.id is <Context: {'lang': 'py', 'task': 'tasks.p0', 'id': '03b009af-dc35-46c5-8216-a6868e66c9be', [ ... ]}> (type <class 'celery.app.task.Context'>)
问题是:
无论p0_fail调用Exception,结果的(即celery.result.AsyncResult)属性.info / .result和.traceback都是'None',而文档(http://docs.celeryproject.org/en/latest/reference/celery.result.html)表示应该有相应的异常实例和回溯。是bug还是功能?更新:作为第二和第三个参数传递的exc和traceback。
根据文档(http://docs.celeryproject.org/en/master/userguide/calling.html#linking-callbacks-errbacks)进行操作时,由于任务处于PENDING状态,我会在'result.get'调用中遇到死锁
根据文档,result.id应该是任务的UUID,而debug(代码片段的最后一行)显示它是task.Context类。它是代码或文档中的错误吗?
谢谢。