首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用asyncore实现gethostbyaddr()

使用asyncore实现gethostbyaddr()
EN

Stack Overflow用户
提问于 2017-08-01 01:37:41
回答 1查看 690关注 0票数 1

我很享受socket.gethostbyaddr()的乐趣,寻找如何加速一个真正简单的代码,随机生成一些IP地址,并试图解决它们。当找不到主机时,问题就出现了,超时可能会很长(大约10秒...)

一次偶然的机会,我发现了这篇文章,他使用多线程解决了这个问题:https://www.depier.re/attempts_to_speed_up_gethostbyaddr/

我想知道是否有可能使用Asyncore做一些等效的事情?这就是我首先尝试做的,但不幸失败了……

下面是一个模板:

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-01 14:29:22

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

asyncio和类似的库使用所谓的协程和协作调度。协作意味着编写协程来支持并发。一个正在运行的协程显式地将控制返回给等待调度器,该调度器然后选择另一个协程并运行它,直到那个协程返回控制,依此类推。一次只能运行一个协程。为了顺利运行,协程不能在没有返回控制的情况下长时间执行代码。协程中的阻塞操作会阻塞整个程序。这禁止使用gethostbyaddr

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45422087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档