为什么Celery不会在底层任务抛出异常时抛出异常

Kev*_*yer 31 python exception-handling celery

Celery似乎没有正确处理异常.

如果我有任务:

def errorTest():
    raise Exception()
Run Code Online (Sandbox Code Playgroud)

然后我打电话

r = errorTest.delay()
In [8]: r.result

In [9]: r.state
Out[9]: 'PENDING'
Run Code Online (Sandbox Code Playgroud)

它会无限期地挂起来.

去检查日志显示错误被抛出任务(如果你想要消息,请问),我知道后端和一切都设置正确,因为其他任务正常工作并正确返回结果.

在Celery中捕捉异常需要做些什么时髦吗?

/ Celery版本是3.0.13,经纪人是RabbitMQ在我的本地机器上运行

sed*_*nym 31

如果您在CELERY_ALWAYS_EAGER设置为True的情况下运行Celery,那么请确保在您的设置中也包含此行:

CELERY_EAGER_PROPAGATES_EXCEPTIONS = True
Run Code Online (Sandbox Code Playgroud)

http://docs.celeryproject.org/en/latest/configuration.html#celery-eager-propagates-exceptions

  • 如果您想暂时打开异常传播以进行调试,还可以在使用apply()调用任务时将throw设置为True.即name_of_task_to_debug.apply(throw = True) (4认同)
  • 自Celery 4.2起,根据http://docs.celeryproject.org/en/latest/userguide/configuration.html,此值似乎已重命名为`CELERY_TASK_EAGER_PROPAGATES`。 (2认同)

小智 13

您可以on_failureTask子类中定义一个函数来正确处理它们.如果您只是想了解发生了什么,您可以设置错误电子邮件通知,它会在您的芹菜配置中向您发送堆栈跟踪.

注意:从v4开始,Celery 不再支持发送电子邮件.