socket.gethostbyname()
效果很好。但是当它是一个不存在的主机时,我会得到 3 秒超时,然后是
socket.gaierror: [Errno 11001] getaddrinfo failed
我不介意例外(这是合适的),但是有什么办法可以减少超时吗?
经过此操作后,一个简单的解决方案是:
import socket
socket.setdefaulttimeout(5) #Default this is 30
socket.gethostbyname(your_url)
如果Python使用系统
gethostbyname()
,这是不可能的。我不确定您是否真的想要这个,因为您可能会收到错误的超时。
有一次我遇到了类似的问题,但是来自 C++:我必须调用大量名称的函数,所以长时间的超时确实很痛苦。一个解决方案是从许多线程并行调用它,因此虽然其中一些线程卡在等待超时,但所有其他线程都运行良好。
我对线程很陌生,但我尝试实现@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"))