Celery中“错误处理”回调的不同问题

时间:2018-06-07 09:16:02

标签: python error-handling celery

我刚刚开始使用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'>)

问题是:

  1. 无论p0_fail调用Exception,结果的(即celery.result.AsyncResult)属性.info / .result和.traceback都是'None',而文档(http://docs.celeryproject.org/en/latest/reference/celery.result.html)表示应该有相应的异常实例和回溯。是bug还是功能?更新:作为第二和第三个参数传递的exc和traceback。

  2. 根据文档(http://docs.celeryproject.org/en/master/userguide/calling.html#linking-callbacks-errbacks)进行操作时,由于任务处于PENDING状态,我会在'result.get'调用中遇到死锁

    • 如果任务因异常而失败,状态为PENDING?
    • Celery的任务是否真的停止了,或者是否处于活跃/待定状态吃Celery的资源?
  3. 根据文档,result.id应该是任务的UUID,而debug(代码片段的最后一行)显示它是task.Context类。它是代码或文档中的错误吗?

  4. 谢谢。

0 个答案:

没有答案