Python celery:如果存在异常,则检索任务参数

时间:2014-10-06 20:04:49

标签: python exception-handling celery

我开始使用Celery和Python,我有一个可能很简单的问题,但我似乎无法找到任何合适的答案......

如果我有一堆任务,并且其中一个抛出异常,是否有办法检索传递给所述任务的参数?

例如,如果我想获取一些主机名解析的IP,我创建一个任务......

@tasks_app.task
def resolve_hostname(hostname):
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)})

...可以抛出异常,有没有办法在异常发生时获取调用之外的hostname参数的值?

我们说我将任务分组如下:

ip_subtasks = group(
    resolve_hostname.s(hostname) for hostname in ['google.com',
                                                  'yahoo.com',
                                                  'failure.kommm']
)()

最后一个(尝试解析failure.kommm)将引发异常。我想将芹菜任务的get()方法放在try/catch内,并在尝试解决failure.kommm 时显示一条消息,指出出错了。如下所示:

for ip_subtask in ip_subtasks:
    try:
        hostname, ips = ip_subtask.get(timeout=45)
    except dns.exception.DNSException, e:
        # I WISHED THIS WORKED:
        logger.exception("Something happened when trying"
                         " to resolve %s" % ip_subtask.args[0])

那么,这就是问题......如果我有自己的任务实例,有没有办法检索任务执行的参数?

提前谢谢。

1 个答案:

答案 0 :(得分:9)

为此,您可以使用abstract class来实现on_failure处理程序。

from celery import Task

class DebugTask(Task):
    abstract = True

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        logger.exception("Something happened when trying"
                         " to resolve %s" % args[0])

@tasks_app.task(base=DebugTask)
def resolve_hostname(hostname):
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)})

来自文档:

on_failure(self, exc, task_id, args, kwargs, einfo)

Parameters: 
  exc     – The exception raised by the task.
  task_id – Unique id of the failed task.
  args    – Original arguments for the task that failed.
  kwargs  – Original keyword arguments for the task that failed.
  einfo   – ExceptionInfo instance, containing the traceback.