我正在使用xmlrpclib.ServerProxy对远程服务器进行RPC调用.如果没有到服务器的网络连接,则需要默认的10秒钟才能将socket.gaierror返回给我的程序.
在没有网络连接的情况下进行开发或者远程服务器关闭时,这很烦人.有没有办法更新我的ServerProxy对象上的超时?
我看不到一个明确的方法来访问套接字来更新它.
更直接的解决方案是:http: //www.devpicayune.com/entry/200609191448
import xmlrpclib import socket x = xmlrpclib.ServerProxy('http:1.2.3.4') socket.setdefaulttimeout(10) #set the timeout to 10 seconds x.func_name(args) #times out after 10 seconds socket.setdefaulttimeout(None) #sets the default back
干净的非全球版本.
import xmlrpclib import httplib class TimeoutHTTPConnection(httplib.HTTPConnection): def connect(self): httplib.HTTPConnection.connect(self) self.sock.settimeout(self.timeout) class TimeoutHTTP(httplib.HTTP): _connection_class = TimeoutHTTPConnection def set_timeout(self, timeout): self._conn.timeout = timeout class TimeoutTransport(xmlrpclib.Transport): def __init__(self, timeout=10, *l, **kw): xmlrpclib.Transport.__init__(self, *l, **kw) self.timeout = timeout def make_connection(self, host): conn = TimeoutHTTP(host) conn.set_timeout(self.timeout) return conn class TimeoutServerProxy(xmlrpclib.ServerProxy): def __init__(self, uri, timeout=10, *l, **kw): kw['transport'] = TimeoutTransport( timeout=timeout, use_datetime=kw.get('use_datetime', 0)) xmlrpclib.ServerProxy.__init__(self, uri, *l, **kw) if __name__ == "__main__": s = TimeoutServerProxy('http://127.0.0.1:9090', timeout=2) s.dummy()
我已经看了几种方法来解决这个问题,到目前为止,最优雅的方法在这里描述:https: //seattle.cs.washington.edu/browser/seattle/trunk/demokit/timeout_xmlrpclib.py?ev = 692
这项技术最初是在这里提出的,但这个链接已经死了:http: //blog.bjola.ca/2007/08/using-timeout-with-xmlrpclib.html
这适用于Python 2.5和2.6.新链接声称也可以使用Python 3.0.