利用可能なすべてのアイテムを常にキューから引き出している場合、ロック付きのリストだけでなく、キューを使用することに実際の意味はありますか? すなわち:
from __future__ import with_statement
import threading
class ItemStore(object):
def __init__(self):
self.lock = threading.Lock()
self.items = []
def add(self, item):
with self.lock:
self.items.append(item)
def getAll(self):
with self.lock:
items, self.items = self.items, []
return items
それらを個別にプルし、空のキューのブロッキング動作を利用する場合は、Queue を使用する必要がありますが、ユースケースははるかに単純に見え、上記のアプローチの方が適している可能性があります。
[Edit2] アイドルループからキューをポーリングしているという事実を見逃していました。更新から、問題は競合に関連していないことがわかります。そのため、以下のアプローチは実際には問題に関連していません. 誰かがこの便利なブロッキングバリアントを見つけた場合に備えて、私はそれを残しました:
少なくとも 1 つの結果が得られるまでブロックしたい場合は、上記のコードを変更して、プロデューサー スレッドからのシグナルによってデータが利用可能になるのを待つことができます。例えば。
class ItemStore(object):
def __init__(self):
self.cond = threading.Condition()
self.items = []
def add(self, item):
with self.cond:
self.items.append(item)
self.cond.notify() # Wake 1 thread waiting on cond (if any)
def getAll(self, blocking=False):
with self.cond:
# If blocking is true, always return at least 1 item
while blocking and len(self.items) == 0:
self.cond.wait()
items, self.items = self.items, []
return items