使用asyncore实现gethostbyaddr()

时间:2017-07-31 17:37:41

标签: python python-2.7 sockets dns asyncore

我很高兴使用socket.gethostbyaddr(),搜索如何加速一个非常简单的代码,该代码随机生成一些IP地址并尝试解决它们。当没有找到主机时,问题就出现了,超时可能很长(大约10秒......)

偶然的机会,我找到了这篇文章,他通过使用多线程解决了这个问题: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 个答案:

答案 0 :(得分:1)

您正在寻找一种如何将多个IP并行转换为名称(反之亦然)的方法。基本上它是DNS请求/响应操作,gethostbyaddr同步进行此查找,即以阻塞方式。它发送请求,等待响应,返回结果。

asyncio和类似的库使用所谓的协同程序和协作调度。合作意味着协同程序的编写是为了支持协商。正在运行的协程显式地将控件(使用await或yield from)返回给等待的调度程序,然后调度程序选择另一个协同程序并运行它直到返回控件,依此类推。一次只能运行一个协程。为了顺利运行,协程不能在不返回控件的情况下长时间执行代码。协程中的阻塞操作阻止整个程序。这禁止使用gethostbyaddr

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

有异步DNS的第三方库,但我从未使用它们。查看aiodns示例,编写您正在寻找的代码似乎很容易。 asyncore.gather可能是这种功能的核心。