この質問は、主にメモリ内の膨大なデータセットの並べ替えに関して、私がここで尋ねた他の質問に関連しています。
基本的に、これは私が欲しい/持っているものです:
ねじれた XMLRPC サーバーが実行されています。このサーバーは、Foo クラスのいくつか (32) のインスタンスをメモリに保持します。各 Foo クラスには、リスト バー (数百万のレコードが含まれます) が含まれます。データベースからデータを取得し、それを XMLRPC サーバーに渡すサービスがあります。データは基本的に、各 Foo インスタンスに対応するキーを持つ辞書であり、値は次のような辞書のリストです。
data = {'foo1':[{'k1':'v1', 'k2':'v2'}, {'k1':'v1', 'k2':'v2'}], 'foo2':...}
次に、各 Foo インスタンスにそのキーに対応する値が渡され、Foo.bar 辞書が更新されて並べ替えられます。
class XMLRPCController(xmlrpc.XMLRPC):
def __init__(self):
...
self.foos = {'foo1':Foo(), 'foo2':Foo(), 'foo3':Foo()}
...
def update(self, data):
for k, v in data:
threads.deferToThread(self.foos[k].processData, v)
def getData(self, fookey):
# return first 10 records of specified Foo.bar
return self.foos[fookey].bar[0:10]
class Foo():
def __init__(self):
bar = []
def processData(self, new_bar_data):
for record in new_bar_data:
# do processing, and add record, then sort
# BUNCH OF PROCESSING CODE
self.bar.sort(reverse=True)
問題は、更新関数が多数のレコード (たとえば 100K +) を使用して XMLRPCController で呼び出されると、32 個の Foo インスタンスすべてが process_data メソッドを完了するまで getData 呼び出しに応答しなくなることです。deferToThread が動作すると思っていましたが、どこに問題があるのかを誤解していると思います。
任意の提案...この必要な動作をサポートしている場合、Cherrypy など、他のものを使用することにオープンです。
編集
@Troy: これが原子炉のセットアップ方法です
reactor.listenTCP(port_no, server.Site(XMLRPCController)
reactor.run()
GIL に関する限り、sys.setcheckinterval() の値を小さい値に変更して、データのロックを解除して読み取りできるようにすることは実行可能なオプションでしょうか?