Python 芹菜:如果出现异常,则检索任务参数



我刚开始学习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中,并显示一条消息,说在试图解决故障时出现了问题。komm(如下所示):

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

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

提前谢谢。

要做到这一点,您可以使用抽象类来实现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.

相关内容

  • 没有找到相关文章

最新更新