2014-10-06 57 views
5

我开始使用芹菜和Python,我有一个问题可能很简单,但我似乎无法找到任何合适的答案。Python芹菜:检索任务的参数,如果有例外

如果我有一堆的任务,其中一个引发异常,是否有一种方法来检索传递给所述任务的参数?

举例来说,如果我想获得一些主机名解析到IPS,以及创建一个任务...

@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]) 

所以,这就是问题......如果我有任务实例本身,是否有一种方法可以检索任务执行的参数?

预先感谢您。

+0

你有没有看一个'on_failure'处理? http://celery.readthedocs.org/en/latest/userguide/tasks.html#on_failure – Ngenator 2014-10-06 20:33:16

+0

我有,我认为它会工作,但我不知道如何使用它,当任务通过创建像上面显示的装饰器(正如我所说的,我是一个Celery的新手) – BorrajaX 2014-10-06 21:06:02

+0

查看上面的处理程序部分,它告诉你如何用抽象类来做到这一点。 – Ngenator 2014-10-06 21:16:02

回答

7

为此,您可以使用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.