いくつかの検索手順が異なるスレッドに並列化されている状況があります。各スレッドは同じpymongo.cursor.Cusor
オブジェクトを取得して結果を確認しますが、各スレッドは異なる処理を実行します。次のようなデモ手順を作成しました。
class SearchProcedure(Thread):
weight = 0.1
def __init__(self,weight=None):
if weight:
self.weight = float(weight)
Thread.__init__(self)
def start(self,query):
self.query = query
Thread.start(self)
def run(self):
if hasattr(self,'places'):
for p in self.places.values():
print p.name
if hasattr(self,'posts'):
for s in self.posts.values():
s.rewind()
print [(sh['name'],sh['description']) for sh in s]
def attach_eligible(self,queue,**kwargs):
self.queue = queue
for (name,value) in kwargs.items():
setattr(self,name,value)
このattach_eligible
メソッドでは、場所と投稿のプロパティをプロシージャオブジェクトに追加します。繰り返しになりますが、posts
プロパティは反復可能なmongoカーソルのセットです。結果を実行するrewind
前に、別のスレッドがすでにカーソルを巻き戻している場合は、カーソルを元の状態にリセットするために使用します。アイデアは、各スレッドが異なる基準を使用してオブジェクトを検索し、その結果をqueue
呼び出し元/インスタンス化スコープで使用するためにプロパティに出力するというものです。
最初のスレッドは正常に実行されますが、後続のすべてのスレッドはカーソルを利用して次のエラーを出力します。
File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 668, in __send_message
assert response["starting_from"] == self.__retrieved
AssertionError
巻き戻しは、効果がないように思われます。これは、カーソルが参照によって渡されるためですか?ロックステータスを維持するために、それらもキューに含める必要がありますか?モンゴカーソルでこのようなことをすることさえ可能ですか?検索条件を同時に実行すると、検索条件の処理のパフォーマンスが大幅に向上するので、できれば便利です。