清除`deque`s:它是线程安全的吗?

时间:2018-03-05 16:10:00

标签: python multithreading python-3.x python-2.7 deque

我一直在阅读CPython的collections.deque herehere的线程安全性。我了解.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

代替?

2 个答案:

答案 0 :(得分:1)

来自documentation of the api

  

Deques支持线程安全,内存有效的追加和来自任意一方的双端队列,在任一方向上具有大致相同的O(1)性能   (强调我的)

这意味着您可以在任何一方弹出并仍享受其中的好处。就clear()方法而言,人们只能通过查看实现来确定,但我认为它的实现方式与您建议的方式相同。

编辑: 此外,如果我从阻塞队列的java实现中正确记住,出于所有预期目的应该非常接近这个,在队列对象上调用clear()并不保证当你在下一个代码行访问它,你会发现它是空的

答案 1 :(得分:0)

如果我记得,它们不应该干扰你要做的事情,因为它们会在资源上放置一个互斥并独立执行任何操作,并且只要你在尝试时从资源中捕获异常(如果它是空的)流行你应该很高兴去。