我有一个 python 对象,其方法目前正在使用标准 xmlrpc.server.SimpleXMLRPCServer (使用 ThreadingMixIn,但这不应该是相关的)通过 XML-RPC 公开。
服务器和客户端一样在 Win64 上运行。一些 RPC 方法将信息表从数据库返回给客户端。我发现即使是适度的数据块也会使操作系统不堪重负,并且出现这种错误:
回溯(最近一次通话最后): 运行中的文件“C:\Python32\lib\wsgiref\handlers.py”,第 137 行 self.result = application(self.environ, self.start_response) __call__ 中的文件“U:\Me\src\application\my_xmlrpc_client.py”,第 1510 行 身体 = 方法(环境,start_response) q_root 中的文件“U:\Me\src\application\my_xmlrpc_client.py”,第 305 行 行 = proxy.return_table() 文件“C:\Python32\lib\xmlrpc\client.py”,第 1095 行,在 __call__ 中 返回 self.__send(self.__name, args) 文件“C:\Python32\lib\xmlrpc\client.py”,第 1423 行,在 __request 详细=自我.__详细 文件“C:\Python32\lib\xmlrpc\client.py”,第 1136 行,在请求中 return self.single_request(主机,处理程序,request_body,详细) 文件“C:\Python32\lib\xmlrpc\client.py”,第 1151 行,在 single_request 中 返回 self.parse_response(resp) 文件“C:\Python32\lib\xmlrpc\client.py”,第 1323 行,在 parse_response 返回 u.close() 文件“C:\Python32\lib\xmlrpc\client.py”,第 667 行,关闭 引发故障(**self._stack[0]) xmlrpc.client.Fault: :[Errno 12] 空间不足"> LIBRA.rsvfx.com - - [19/May/2011 15:58:09] “GET / HTTP/1.1” 500 59
对 Errno 12 问题的一些研究表明,底层 MS OS 调用存在一些问题,而不是 python 本身: http ://bugs.python.org/issue11395
我不是一个非常有经验的 XML-RPC 开发人员。但是我应该遵循一些标准约定来交付大型有效负载,这会导致更多、更小的写入(而不是更少的、大型写入)?
请记住我问的是缓冲区溢出;我不想争论为什么我使用 XML-RPC 而不是滚动我自己的 RESTful 接口......我必须为这个问题修补我的 WSGI 应用程序 - 发送小的 1k 块而不是更大的块。我不确定如何修补 XML-RPC 应用程序。
- 编辑 -
根据要求,这里是重现问题的代码示例:
导入 xmlrpc.server RPCApp 类: def get_page(self): return ["data" * 64 for i in range(0,1024)] if __name__ == '__main__' : # 使用此块很重要,以便进程正确生成 服务器 = xmlrpc.server.SimpleXMLRPCServer(('127.0.0.1',8989), allow_none=True, logRequests=False) server.register_instance(RPCApp()) server.serve_forever()
和客户端代码:
导入 xmlrpc.client proxy = xmlrpc.client.ServerProxy('http://127.0.0.1:8989', allow_none=True) 打印(proxy.get_page())
如果您将服务器中的页面操作得很小,那么代码就可以工作。照原样,抛出异常。
- 编辑 -
似乎在 python 3.2.1rc1 中得到解决。看起来我们必须升级我们的安装....