xmlrpc服务器的问题
问题描述:
我用xmlrpc服务器运行简单的例子,然后按下键盘上的Ctrl-C :)。按下键盘后xmlrpc服务器的问题
from SimpleXMLRPCServer import SimpleXMLRPCServer from time import sleep import threading,time class Test(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.test1 = 0 def test(self): return self.test1 def run(self): while(1): time.sleep(1) self.test1 = self.test1 + 1 ts = Test() ts.start() server = SimpleXMLRPCServer(("localhost",8888)) server.register_instance(ts) server.serve_forever()
错误:
File "/usr/lib/python2.7/SocketServer.py", line 225, in serve_forever r, w, e = select.select([self], [], [], poll_interval) KeyboardInterrupt
客户
from xmlrpclib import ServerProxy r=ServerProxy("http://localhost:8888") print r.test()等待连接没有错误或警告。在这种情况下如何断开连接? 也许这个例子不正确?
答
使用超时:
Set timeout for xmlrpclib.ServerProxy
编辑
链接到这里的答案是不是与Python 2.7兼容。该作品(上W7/ActivePython的测试2.7)下面是修改后的代码:
import xmlrpclib
import httplib
class TimeoutHTTPConnection(httplib.HTTPConnection):
def __init__(self,host,timeout=10):
httplib.HTTPConnection.__init__(self,host,timeout=timeout)
self.set_debuglevel(99)
#self.sock.settimeout(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 = TimeoutHTTPConnection(host,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:8888',timeout=2)
print s.test()
答
让您Test
实例邪,退出时,主线程退出:
ts = Test()
ts.setDaemon(True)
ts.start()
的问题是,为什么你需要将线程注册为XML-RPC处理程序。
这不起作用希望python 2.7
– Bdfy 2011-04-14 16:18:03@Bdfy - 看到我编辑的答案与工作代码 – 2011-04-14 16:58:36