python socket.gethostbyaddr() - 如何减少超时?

5 投票
3 回答
3675 浏览
提问于 2025-04-17 10:12

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) 

撰写回答