Python 3.2.0 на Win64, XML-RPC с большой нагрузкой сбой - PullRequest
2 голосов
/ 20 мая 2011

У меня есть объект python, методы которого в настоящее время предоставляются через XML-RPC с использованием стандартного xmlrpc.server.SimpleXMLRPCServer (с ThreadingMixIn, но это не должно относиться к делу).

Сервер работает на Win64, как и клиенты. Некоторые методы RPC возвращают таблицы информации из базы данных клиенту. Я обнаружил, что даже скромные блоки данных перегружают ОС, и я получаю такую ​​ошибку:

Traceback (most recent call last):
  File "C:\Python32\lib\wsgiref\handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "U:\Me\src\application\my_xmlrpc_client.py", line 1510, in __call__
    body = method(environ, start_response)
  File "U:\Me\src\application\my_xmlrpc_client.py", line 305, in q_root
    rows = proxy.return_table()
  File "C:\Python32\lib\xmlrpc\client.py", line 1095, in __call__
    return self.__send(self.__name, args)
  File "C:\Python32\lib\xmlrpc\client.py", line 1423, in __request
    verbose=self.__verbose
  File "C:\Python32\lib\xmlrpc\client.py", line 1136, in request
    return self.single_request(host, handler, request_body, verbose)
  File "C:\Python32\lib\xmlrpc\client.py", line 1151, in single_request
    return self.parse_response(resp)
  File "C:\Python32\lib\xmlrpc\client.py", line 1323, in parse_response
    return u.close()
  File "C:\Python32\lib\xmlrpc\client.py", line 667, in close
    raise Fault(**self._stack[0])
xmlrpc.client.Fault: :[Errno 12] Not enough space">
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 для этой проблемы - отправка небольших блоков по 1 КБ, а не больших блоков. Я не уверен, как исправить приложение XML-RPC.

- редактировать -

В соответствии с запросом приведен пример кода, который воспроизводит проблему:

import xmlrpc.server
class RPCApp :
    def get_page(self):
        return ["data" * 64 for i in range(0,1024)]
if __name__ == '__main__' : # important to use this block, for processes to spawn correctly
    server = xmlrpc.server.SimpleXMLRPCServer(('127.0.0.1',8989), allow_none=True, logRequests=False)
    server.register_instance(RPCApp())
    server.serve_forever()

И код клиента:

import xmlrpc.client
proxy = xmlrpc.client.ServerProxy('http://127.0.0.1:8989', allow_none=True)
print(proxy.get_page())

Если вы управляете страницей на сервере, чтобы она была маленькой, то код работает. На самом деле, исключение выдается.

- редактировать -

Кажется, будет решено в Python 3.2.1rc1. Похоже, нам придется обновить нашу установку ....

...