xmlrpclib客户端请求超时设置
我正在使用Python的xmlrpclib来向一个xml-rpc服务发送请求。
有没有办法设置一个客户端超时时间,这样当服务器不可用时,我的请求就不会一直卡在那里?
我知道可以通过socket.setdefaulttimeout()
来全局设置一个socket超时时间,但我不太想这样做。
5 个回答
5
为什么不这样做呢:
class TimeoutTransport(xmlrpclib.Transport):
def setTimeout(self, timeout):
self._timeout = timeout
def make_connection(self, host):
return httplib.HTTPConnection(host, timeout=self._timeout)
?
毕竟,HTTP
和 HTTPS
看起来只是为了兼容旧版Python而存在的类而已。
8
哎呀,要在 Python 2.6 及以上版本中让这个工作,可以这样做:
class HTTP_with_timeout(httplib.HTTP):
def __init__(self, host='', port=None, strict=None, timeout=5.0):
if port == 0: port = None
self._setup(self._connection_class(host, port, strict, timeout=timeout))
def getresponse(self, *args, **kw):
return self._conn.getresponse(*args, **kw)
class TimeoutTransport(xmlrpclib.Transport):
timeout = 10.0
def set_timeout(self, timeout):
self.timeout = timeout
def make_connection(self, host):
h = HTTP_with_timeout(host, timeout=self.timeout)
return h
12
一个干净的做法是定义并使用一个自定义的传输方式,比如:
import xmlrpclib, httplib
class TimeoutTransport(xmlrpclib.Transport):
timeout = 10.0
def set_timeout(self, timeout):
self.timeout = timeout
def make_connection(self, host):
h = httplib.HTTPConnection(host, timeout=self.timeout)
return h
t = TimeoutTransport()
t.set_timeout(20.0)
server = xmlrpclib.Server('http://time.xmlrpc.com/RPC2', transport=t)
在文档中有一个定义和使用自定义传输的例子,虽然它是用来做不同的事情(通过代理访问,而不是设置超时),但这段代码基本上是受到那个例子的启发。