現在、標準のxmlrpc.server.SimpleXMLRPCServer(ThreadingMixInを使用)を使用してXML-RPCを介してメソッドが公開されているPythonオブジェクトがありますが、これは関係ありません。
サーバーはクライアントと同様にWin64で実行されています。一部のRPCメソッドは、データベースからクライアントに情報のテーブルを返します。ささやかなデータブロックでさえOSを圧倒していることに気づき、この種のエラーが発生します。
トレースバック(最後の最後の呼び出し): ファイル"C:\ Python32 \ lib \ wsgiref \ handlers.py"、137行目、実行中 self.result = application(self.environ、self.start_response) ファイル"U:\ Me \ src \ application \ my_xmlrpc_client.py"、1510行目、__ call__ body = method(environ、start_response) ファイル"U:\ Me \ src \ application \ my_xmlrpc_client.py"、305行目、q_root 行=proxy.return_table() ファイル"C:\ Python32 \ lib \ xmlrpc \ client.py"、行1095、__ call__ self .__ send(self .__ name、args)を返します __requestのファイル「C:\ Python32 \ lib \ xmlrpc \ client.py」、1423行目 verbose = self .__ verbose ファイル"C:\ Python32 \ lib \ xmlrpc \ client.py"、1136行目、リクエスト self.single_request(host、handler、request_body、verbose)を返します ファイル「C:\ Python32 \ lib \ xmlrpc \ client.py」、1151行目、single_request self.parse_response(resp)を返します parse_responseのファイル「C:\ Python32 \ lib \ xmlrpc \ client.py」、1323行目 u.close()を返す ファイル"C:\ Python32 \ lib \ xmlrpc \ client.py"、行667、近くに Fault(** self._stack [0])を発生させます xmlrpc.client.Fault ::[Errno12]十分なスペースがありません"> LIBRA.rsvfx.com ---[2011年5月19日15:58:09]"GET/ HTTP / 1.1" 500 59
Errno 12の問題に関するいくつかの調査では、Python自体ではなく、基盤となるMS OS呼び出しに問題があることが明らかになっています:http: //bugs.python.org/issue11395
私は経験豊富なXML-RPC開発者ではありません。しかし、大きなペイロードを配信するために従わなければならない標準的な規則がありますか?これにより、書き込みが少なくなり、大きな書き込みが少なくなりますか?
また、バッファオーバーランについて質問していることを忘れないでください。独自のRESTfulインターフェイスをローリングするのではなくXML-RPCを使用している理由について議論する必要はありません...この問題については、WSGIアプリケーションにパッチを適用する必要がありました。大きなブロックではなく小さな1kブロックを送信します。XML-RPCアプリケーションにパッチを適用する方法がわかりません。
- 編集 -
要求に応じて、問題を再現するコードサンプルを次に示します。
xmlrpc.serverをインポートします クラスRPCApp: def get_page(self): return ["data" * 64 for i in range(0,1024)] if __name__ =='__main __':#プロセスが正しくスポーンするために、このブロックを使用することが重要 server = 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) print(proxy.get_page())
サーバーのページを小さく操作すると、コードは機能します。そのまま、例外がスローされます。
- 編集 -
Python3.2.1rc1で解決されているようです。インストールをアップグレードする必要があるようです。