我开始使用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])
那么,这就是问题......如果我有自己的任务实例,有没有办法检索任务执行的参数?
提前谢谢。
答案 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.