使用 asyncore 实现 gethostbyaddr()
Implement gethostbyaddr() with 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"
您正在寻找一种将多个 IP 并行转换为名称(或相反)的方法。基本上它是一个 DNS request/response 操作并且 gethostbyaddr
正在同步执行此查找,即以阻塞方式。它发送请求,等待响应,returns结果。
asyncio 和类似的库使用所谓的协程和协作调度。合作意味着编写协程来支持并发。一个 运行ning 协程显式 returns 控制(使用 await 或 yield from)等待调度程序然后选择另一个协程并 运行s 它直到那个 returns 控制等等。一次只能 运行ning 一个协程。为了顺利 运行 协同程序不得在不返回控制权的情况下执行更长时间的代码。协程中的阻塞操作会阻塞整个程序。禁止使用 gethostbyaddr
.
一个解决方案需要支持异步 DNS 查找。协程发送 DNS 请求,设置超时,安排将 DNS 响应传递给它和 returns 控制。因此,多个协程可以在等待所有响应之前一个接一个地发送请求。
异步 DNS 有第三方库,但我从未使用过。查看 aiodns 个示例,编写您要查找的代码似乎很容易。 asyncore.gather
大概是这个功能的核心吧。
我在 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"
您正在寻找一种将多个 IP 并行转换为名称(或相反)的方法。基本上它是一个 DNS request/response 操作并且 gethostbyaddr
正在同步执行此查找,即以阻塞方式。它发送请求,等待响应,returns结果。
asyncio 和类似的库使用所谓的协程和协作调度。合作意味着编写协程来支持并发。一个 运行ning 协程显式 returns 控制(使用 await 或 yield from)等待调度程序然后选择另一个协程并 运行s 它直到那个 returns 控制等等。一次只能 运行ning 一个协程。为了顺利 运行 协同程序不得在不返回控制权的情况下执行更长时间的代码。协程中的阻塞操作会阻塞整个程序。禁止使用 gethostbyaddr
.
一个解决方案需要支持异步 DNS 查找。协程发送 DNS 请求,设置超时,安排将 DNS 响应传递给它和 returns 控制。因此,多个协程可以在等待所有响应之前一个接一个地发送请求。
异步 DNS 有第三方库,但我从未使用过。查看 aiodns 个示例,编写您要查找的代码似乎很容易。 asyncore.gather
大概是这个功能的核心吧。