我很享受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"发布于 2017-08-01 14:29:22
您正在寻找一种如何并行地将多个in转换为名称(反之亦然)的方法。基本上,它是DNS请求/响应操作,并且gethostbyaddr同步地进行该查找,即以阻塞方式。它发送请求,等待响应,返回结果。
asyncio和类似的库使用所谓的协程和协作调度。协作意味着编写协程来支持并发。一个正在运行的协程显式地将控制返回给等待调度器,该调度器然后选择另一个协程并运行它,直到那个协程返回控制,依此类推。一次只能运行一个协程。为了顺利运行,协程不能在没有返回控制的情况下长时间执行代码。协程中的阻塞操作会阻塞整个程序。这禁止使用gethostbyaddr。
解决方案需要支持异步DNS查找。协程发送DNS请求、设置超时、安排DNS响应将被传递给它并返回控制。因此,多个协程可以在等待所有响应之前一个接一个地发送请求。
有用于异步DNS的第三方库,但我从未使用过它们。查看aiodns示例,似乎很容易编写您要查找的代码。asyncore.gather可能是这类函数的核心。
https://stackoverflow.com/questions/45422087
复制相似问题