Set timeout for xmlrpclib.ServerProxy

前端 未结 9 1601
轮回少年
轮回少年 2020-12-29 22:33

I am using xmlrpclib.ServerProxy to make RPC calls to a remote server. If there is not a network connection to the server it takes the default 10 seconds to return a socket.

9条回答
  •  生来不讨喜
    2020-12-29 23:08

    Based on the one from antonylesuisse, a working version (on python >= 2.6).

    # -*- coding: utf8 -*-
    import xmlrpclib
    import httplib
    import socket
    
    class TimeoutHTTP(httplib.HTTP):
       def __init__(self, host='', port=None, strict=None,
                    timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
            if port == 0:
                port = None
            self._setup(self._connection_class(host, port, strict, timeout))
    
    class TimeoutTransport(xmlrpclib.Transport):
        def __init__(self, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs):
            xmlrpclib.Transport.__init__(self, *args, **kwargs)
            self.timeout = timeout
    
        def make_connection(self, host):
            host, extra_headers, x509 = self.get_host_info(host)
            conn = TimeoutHTTP(host, timeout=self.timeout)
            return conn
    
    class TimeoutServerProxy(xmlrpclib.ServerProxy):
        def __init__(self, uri, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                     *args, **kwargs):
            kwargs['transport'] = TimeoutTransport(timeout=timeout,
                                        use_datetime=kwargs.get('use_datetime', 0))
            xmlrpclib.ServerProxy.__init__(self, uri, *args, **kwargs)
    

提交回复
热议问题