首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >设置xmlrpclib.ServerProxy的超时时间

设置xmlrpclib.ServerProxy的超时时间
EN

Stack Overflow用户
提问于 2008-12-16 19:22:27
回答 7查看 21.3K关注 0票数 24

我正在使用xmlrpclib.ServerProxy对远程服务器进行远程过程调用。如果没有到服务器的网络连接,则默认需要10秒才能将socket.gaierror返回到我的程序。

如果在没有网络连接的情况下进行开发,或者如果远程服务器停机,这会很烦人。有没有办法更新我的ServerProxy对象的超时时间?

我看不到一种明确的方法来访问套接字来更新它。

EN

回答 7

Stack Overflow用户

发布于 2009-11-20 04:09:23

一个更直接的解决方案在:http://www.devpicayune.com/entry/200609191448

代码语言:javascript
复制
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
票数 20
EN

Stack Overflow用户

发布于 2010-01-22 19:10:30

清除非全局版本。

代码语言:javascript
复制
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()
票数 18
EN

Stack Overflow用户

发布于 2015-11-27 01:20:22

我想要一个小的,干净的,但也明确的版本,所以基于这里的所有其他答案,这是我想出来的:

代码语言:javascript
复制
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也要被子类化,如果有人能在这方面给我一些启发,请告诉我。上面的解决方案已经尝试过了,并且工作正常。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/372365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档