2017-06-10 37 views
0

我试图找出如何重新排队已超时(我使用uvloop和aiodns模块)一些异步DNS请求异常后。重新排队期货与ASYNCIO

下面是我设置的循环与代码:

asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) 
loop = asyncio.get_event_loop() 
resolver = aiodns.DNSResolver(loop=loop) 
sem = asyncio.Semaphore(MAX_COUNT) 

此功能进行查找:

async def lookup(name): 
    with (await sem): 
     response = await resolver.query(name, 'A') 
     return response 

我在含名称来查找文件中读取和设置任务,包括回调处理结果:

for n in names: 
    host = '{}.{}'.format(n, domain) 
    task = asyncio.ensure_future(lookup(host)) 
    tasks.append(task) 
    task.add_done_callback(functools.partial(got_result, host)) 

并启动查找队列。

print("Looking up {} subdomains...".format(len(names))) 
loop.run_until_complete(asyncio.wait(tasks)) 
loop.close() 

got_result回调然后我测试future.exception()和对付它,如果有一个,如果没有打印出结果筛选。有些我很好(未找到即域名)的异常,但其他人一样超时我要重新排队的项目。有一个简单的单向增加未来回到循环闯闯或者我需要建立一个独立的函数,该函数和手动重新添加任务?

感谢您的帮助。

回答

2

问题:......但其他人一样超时我要重新排队的项目。

重新排队的任务可能会导致死锁
而不是重新排队的任务,保持任务,例如:

async def lookup(name): 
    with (await sem): 
     retries = 0 
     while retries <= 5: 
      try: 
       response = await resolver.query(name, 'A') 
       break 
      except TimeoutError: 
       retries += 1 
       yield from asyncio.sleep(1) 

     return response    
+0

非常感谢,我从来没有想过它以这种方式处理。我会给它一个镜头。 – Blark