HTTPConnection.request 不尊重超时?
HTTPConnection.request not respecting timeout?
我正在尝试使用 HTTPConnection
(2.7.8) 发出请求,我已使用 HTTPConnection(host, timeout=10)
将超时设置为 10。但是,HTTPConnection.request()
似乎不会在 10 秒后超时。其实HTTPConnection.timeout
好像连HTTPConnection.request()
都不读(只有HTTPConnection.connect()
读。我的理解对吗?timeout
只适用于[=20吗? =] 而不是 request()
?有没有办法让 request()
超时?
更新:
我想我已经进一步缩小了问题的范围:如果我不提供该方案,它就不会遵守套接字超时。如果提供了方案,即完整的 URL 为 http://google.com:22222
,那么它将相应地超时。我想知道为什么该计划的存在会有所作为。也就是说,以下不遵守超时
socket.setdefaulttimeout(3)
conn = HTTPConnection('google.com:22222')
conn.timeout = 3
conn.request('GET', '')
然而,这样做:
socket.setdefaulttimeout(3)
conn = HTTPConnection('http://google.com:22222')
conn.timeout = 3
conn.request('GET', '')
但是,并非所有域都会发生这种情况。
谢谢
以下代码大约需要 30 秒才能失败:
#!/usr/bin/env python2
from httplib import HTTPConnection
conn = HTTPConnection('google.com', 22222, timeout=2)
conn.request('GET', '')
如果将 ip 传递给 HTTPConnection
而不是主机名,则会按预期在 2 秒内引发超时错误:
#!/usr/bin/env python2
import socket
from httplib import HTTPConnection
host, port = 'google.com', 22222
ip, port = socket.getaddrinfo(host, port)[0][-1]
conn = HTTPConnection(ip, port, timeout=2)
conn.request('GET', '')
解释与 ftplib.FTP timeout has inconsistent behaviour 相同:超时可能会限制单个套接字操作,但它没有说明 HTTPConnection()
调用本身的持续时间,它可能会尝试 [=] 返回的多个 ip 地址=14=] 并且超时仅限制单个套接字操作。合并多个操作可能需要更长的时间。
您的 HTTPConnection('http://google.com:22222')
会更快失败,因为 url 是一个不正确的参数:它应该是 host
或 host:port
。绝对 url
被 request()
方法接受——尽管即使在那里它也有特殊的含义——通常,您只需提供路径,例如 '/'
.
我正在尝试使用 HTTPConnection
(2.7.8) 发出请求,我已使用 HTTPConnection(host, timeout=10)
将超时设置为 10。但是,HTTPConnection.request()
似乎不会在 10 秒后超时。其实HTTPConnection.timeout
好像连HTTPConnection.request()
都不读(只有HTTPConnection.connect()
读。我的理解对吗?timeout
只适用于[=20吗? =] 而不是 request()
?有没有办法让 request()
超时?
更新:
我想我已经进一步缩小了问题的范围:如果我不提供该方案,它就不会遵守套接字超时。如果提供了方案,即完整的 URL 为 http://google.com:22222
,那么它将相应地超时。我想知道为什么该计划的存在会有所作为。也就是说,以下不遵守超时
socket.setdefaulttimeout(3)
conn = HTTPConnection('google.com:22222')
conn.timeout = 3
conn.request('GET', '')
然而,这样做:
socket.setdefaulttimeout(3)
conn = HTTPConnection('http://google.com:22222')
conn.timeout = 3
conn.request('GET', '')
但是,并非所有域都会发生这种情况。
谢谢
以下代码大约需要 30 秒才能失败:
#!/usr/bin/env python2
from httplib import HTTPConnection
conn = HTTPConnection('google.com', 22222, timeout=2)
conn.request('GET', '')
如果将 ip 传递给 HTTPConnection
而不是主机名,则会按预期在 2 秒内引发超时错误:
#!/usr/bin/env python2
import socket
from httplib import HTTPConnection
host, port = 'google.com', 22222
ip, port = socket.getaddrinfo(host, port)[0][-1]
conn = HTTPConnection(ip, port, timeout=2)
conn.request('GET', '')
解释与 ftplib.FTP timeout has inconsistent behaviour 相同:超时可能会限制单个套接字操作,但它没有说明 HTTPConnection()
调用本身的持续时间,它可能会尝试 [=] 返回的多个 ip 地址=14=] 并且超时仅限制单个套接字操作。合并多个操作可能需要更长的时间。
您的 HTTPConnection('http://google.com:22222')
会更快失败,因为 url 是一个不正确的参数:它应该是 host
或 host:port
。绝对 url
被 request()
方法接受——尽管即使在那里它也有特殊的含义——通常,您只需提供路径,例如 '/'
.