这不是特定于 Python 3 或 Windows 的问题。查看 create_connection() 的文档:http: //docs.python.org/library/socket.html#socket.create_connection
重要的片段是:
如果 host 是一个非数字的主机名,它将尝试为 AF_INET 和 AF_INET6 解析它,然后尝试依次连接到所有可能的地址,直到连接成功。
它使用 socket.getaddrinfo 解析名称。如果你跑
socket.getaddrinfo('google.com', 59855, 0, socket.SOCK_STREAM)
您可能会返回一些结果。当您调用 socket.create_connection 时,它将遍历所有这些结果,每个结果都会等待 timeout 秒,直到它失败。因为它为每个结果等待 timeout 秒,所以总时间显然会大于 timeout。
如果您使用 IP 地址而不是主机名调用 create_connection,例如
testconn = socket.create_connection(('74.125.226.201', 59855), timeout=5)
你应该得到你的 5 秒超时。
如果您真的很好奇,请查看 create_connection 的源代码。这很简单,您可以看到导致问题的循环:
https ://github.com/python/cpython/blob/3.2/Lib/socket.py#L408