我正在使用xmlrpclib.ServerProxy对远程服务器进行远程过程调用。如果没有到服务器的网络连接,则默认需要10秒才能将socket.gaierror返回到我的程序。
如果在没有网络连接的情况下进行开发,或者如果远程服务器停机,这会很烦人。有没有办法更新我的ServerProxy对象的超时时间?
我看不到一种明确的方法来访问套接字来更新它。
发布于 2009-11-20 04:09:23
一个更直接的解决方案在: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
发布于 2010-01-22 19:10:30
清除非全局版本。
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()
发布于 2015-11-27 01:20:22
我想要一个小的,干净的,但也明确的版本,所以基于这里的所有其他答案,这是我想出来的:
import xmlrpclib
class TimeoutTransport(xmlrpclib.Transport):
def __init__(self, timeout, use_datetime=0):
self.timeout = timeout
# xmlrpclib uses old-style classes so we cannot use super()
xmlrpclib.Transport.__init__(self, use_datetime)
def make_connection(self, host):
connection = xmlrpclib.Transport.make_connection(self, host)
connection.timeout = self.timeout
return connection
class TimeoutServerProxy(xmlrpclib.ServerProxy):
def __init__(self, uri, timeout=10, transport=None, encoding=None, verbose=0, allow_none=0, use_datetime=0):
t = TimeoutTransport(timeout)
xmlrpclib.ServerProxy.__init__(self, uri, t, encoding, verbose, allow_none, use_datetime)
proxy = TimeoutServerProxy(some_url)
一开始我没有意识到xmlrpclib
有老式的类,所以我发现它很有用,并对此进行了评论,否则一切都应该是不言而喻的。
我不明白为什么httplib.HTTP
也要被子类化,如果有人能在这方面给我一些启发,请告诉我。上面的解决方案已经尝试过了,并且工作正常。
https://stackoverflow.com/questions/372365
复制相似问题