2017-07-31 96 views
0

我在socket.gethostbyaddr()上玩得很开心,正在搜索如何加速一个非常简单的代码,它可以随机生成一些IP地址并尝试解决它们。问题来了,当没有主机可以被发现,有一个超时时间可以很长(约10秒...)使用asyncore实现gethostbyaddr()

偶然,我发现这篇文章,他通过使用多线程解决了问题:https://www.depier.re/attempts_to_speed_up_gethostbyaddr/

我想知道是否有可能使用Asyncore做同样的事情?这是我第一次尝试这样做,但悲惨地失败了......

这里是一个模板:

import socket 
import random 

def get_ip(): 
    a = str(random.randint(140,150)) 
    b = str(random.randint(145,150)) 
    c = str(random.randint(145,150)) 

    for d in range(100): 
     addr = a + "." + b + "." + c +"."+ str(1 + d) 
     yield addr 

for addr in get_ip():    
    try: 
     o = socket.gethostbyaddr(addr) 
     print addr + "...Ok :" 
     print "---->"+ str(o[0]) 
    except: 
     print addr + "...Nothing" 

回答

1

您正在寻找一种方式,怎么把几个IP地址转换为并行名(反之亦然)。基本上它是一个DNS请求/响应操作,并且gethostbyaddr正在同步执行此查找,即以阻止方式进行。它发送请求,等待响应,返回结果。

asyncio和类似的库使用所谓的协同程序和协作调度。合作意味着编写协程以支持协作。正在运行的协程显式地将控制(使用await或yield from)返回给等待的调度程序,然后等待的调度程序选择另一个协程并运行它,直到该程序返回控制等等。一次只能运行一个协程。对于平稳运行的协程,如果不返回控制,则不能长时间执行代码。协程中的阻塞操作会阻止整个程序。这禁止使用gethostbyaddr

解决方案需要支持异步DNS查找。协程发送DNS请求,设置超时,安排将DNS响应传递给它并返回控件。因此,多个协程可以在等待所有响应之前一个接一个地发送它们的请求。

有异步DNS的第三方库,但我从来没有使用它们。看看aiodns的例子,看起来很容易编写你正在寻找的代码。 asyncore.gather可能是这种功能的核心。

+0

有用,谢谢! –