xmlrpclib客户端请求超时设置

4 投票
5 回答
8127 浏览
提问于 2025-04-15 20:18

我正在使用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)

毕竟,HTTPHTTPS 看起来只是为了兼容旧版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)

文档中有一个定义和使用自定义传输的例子,虽然它是用来做不同的事情(通过代理访问,而不是设置超时),但这段代码基本上是受到那个例子的启发。

撰写回答