如果您总是将所有可用的项目从队列中拉出,那么使用队列而不只是一个带锁的列表有什么真正意义吗?IE:
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] 我错过了您从空闲循环轮询队列的事实,并且从您的更新中,我发现问题与争用无关,因此以下方法与您的问题并不真正相关. 我把它留了下来,以防有人发现这个有用的阻塞变体:
对于您确实希望在获得至少一个结果之前阻塞的情况,您可以修改上述代码以通过生产者线程发出信号来等待数据可用。例如。
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