python socket.gethostbyaddr() - 如何减少超时?
socket.gethostbyname()
这个函数在你输入一个真实的主机名时效果很好。但是如果你输入一个不存在的主机名,就会出现3秒的超时,然后才会显示下面的内容:
socket.gaierror: [Errno 11001] getaddrinfo failed
我不介意这个异常(这很正常),但有没有办法缩短这个超时时间呢?
3 个回答
0
我对线程还很陌生,但我尝试按照@Andriy Tylychko的建议来使用线程。
from threading import Thread
import time
def is_ip_connected(IP, timeout=2):
ans = {"success": False}
def _is_ip_connected(IP, ans):
try:
socket.gethostbyaddr(IP)
ans["success"] = True
except:
pass
time_thread = Thread(target=time.sleep, args=(timeout,))
IP_thread = Thread(target=_is_ip_connected, kwargs={"IP": IP, "ans": ans})
time_thread.start()
IP_thread.start()
while time_thread.is_alive() and IP_thread.is_alive():
pass
return(ans["success"])
print(is_ip_connected(IP="192.168.1.202"))
1
如果Python使用系统的 gethostbyname()
函数,这可能会变得很麻烦。我不太确定你是否真的想这样,因为这样可能会出现错误的超时情况。
我曾经遇到过类似的问题,不过是用C++写的:我需要处理很多名字,所以长时间的超时让我很头疼。解决办法是同时从多个线程调用这个函数,这样当有一些线程在等待超时时,其他线程就可以正常进行。
2
经过一番研究,简单的解决办法是:
import socket
socket.setdefaulttimeout(5) #Default this is 30
socket.gethostbyname(your_url)