2

我有一个 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 中得到解决。看起来我们必须升级我们的安装....

4

0 回答 0