我刚开始学习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.