我一直在阅读CPython的collections.deque
here和here的线程安全性。我了解.append()
和.popleft()
操作在线程之间相互配合很好,.appendleft()
和.pop()
也是如此。
我的问题是:.popleft()
和.clear()
之间同样适用吗?或者在.popleft()
和.pop()
之间失败?我的情况是我有一个消费者线程,称之为A,持续.popleft()
来自deque
d
的项目,以及生产者线程B,.append()
他们是对。在某些时候,我希望线程B能够说“取消所有待处理的项目”。如果我这样做
d.clear()
由于与线程A的.popleft()
操作发生冲突,是否会导致未定义的行为?如果我说:
while d:
try: d.pop()
except: break
代替?
答案 0 :(得分:1)
Deques支持线程安全,内存有效的追加和来自任意一方的双端队列,在任一方向上具有大致相同的O(1)性能 (强调我的)
这意味着您可以在任何一方弹出并仍享受其中的好处。就clear()
方法而言,人们只能通过查看实现来确定,但我认为它的实现方式与您建议的方式相同。
编辑:
此外,如果我从阻塞队列的java实现中正确记住,出于所有预期目的应该非常接近这个,在队列对象上调用clear()
并不保证当你在下一个代码行访问它,你会发现它是空的
答案 1 :(得分:0)
如果我记得,它们不应该干扰你要做的事情,因为它们会在资源上放置一个互斥并独立执行任何操作,并且只要你在尝试时从资源中捕获异常(如果它是空的)流行你应该很高兴去。