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