【发布时间】:2015-11-03 15:58:43
【问题描述】:
下面是两个简单的python函数。首先尝试连接到 666 上的test.com 域(主机名有效但端口无效)。第二次尝试连接到端口 993 上的imap.mail.outlook.com(主机名有效,但看起来不适合公共使用/访问)。
def fn_outlook(timeout):
try:
socket.create_connection(("imap.mail.outlook.com", 993), timeout=timeout)
except socket.timeout:
pass
def fn_test(timeout):
try:
socket.create_connection(("test.com", 666), timeout=timeout)
except socket.timeout:
pass
以下是该函数在不同超时下的执行时间:
In [14]: %time fn_test(1)
CPU times: user 644 µs, sys: 1.07 ms, total: 1.71 ms
Wall time: 1 s
In [15]: %time fn_test(2)
CPU times: user 589 µs, sys: 1.15 ms, total: 1.74 ms
Wall time: 2 s
In [16]: %time fn_outlook(2)
CPU times: user 838 µs, sys: 2.24 ms, total: 3.08 ms
Wall time: 7.15 s
In [17]: %time fn_outlook(4)
CPU times: user 705 µs, sys: 1.18 ms, total: 1.88 ms
Wall time: 12 s
In [18]: %time fn_test(4)
CPU times: user 483 µs, sys: 795 µs, total: 1.28 ms
Wall time: 4.42 s
对于test.com,连接将在timeout 参数中指定的时间后超时。但是对于imap.mail.outlook.com,事情变得有趣了——套接字连接忽略了超时参数。准确地说 - 不是忽略,而是总是在更长的时间后超时连接。
我可能认为这种行为源自imap.mail.outlook.com 服务器,而不是来自套接字模块。
【问题讨论】:
标签: python python-2.7 sockets