表示套接字函数的超时,Python

时间:2014-03-10 20:27:16

标签: python sockets timeout

我正在开发一个脚本,它会获取域和/或IP的列表,并用它们做一堆事情。

我遇到的问题是我需要IP和域,如果可能的话,所以当我获得IP时,我尝试通过gethostbyaddr()将其解析为主机,反之亦然域名来自gethostbyname()。

这些函数会挂起一段时间,但如果它们无法解决,这会使我的脚本陷入相当程度的困境。我想做的就是如果不能立即解析名称/地址,忽略它并移动到下一个。我在这里看到了其他一些答案,但似乎没有一个是我需要的。一个似乎只适用于UNIX(我在Windows上),如果主机无法解析,其他人似乎终止了整个脚本。我只想转到下一个。

有什么想法吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

不幸的是,在python中没有一个很好的跨平台解决方案来设置gethostbyname和gethostbyaddr的超时。

您可以使用multiprocessing.Process将gethostbyname调用包装在Process中,然后加入该过程几秒钟。

def resolve(host, ret):
    ret['val'] = socket.gethostbyname(host)


for host in hostnames_to_resolve:
    manager = Manager()
    return_data = manager.dict()
    p = multiprocessing.Process(target=resolve, args=(host,return_data))
    p.start()
    p.join(2) # 2 second timeout

    if p.is_alive():
        p.terminate()
        p.join()
    else:
        print return_data['val'] # the result of the gethostbyname call