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

问题描述 投票:3回答:2

我一直在阅读关于CPython的collections.deque herehere的线程安全性。据我所知,.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

代替?

python multithreading python-3.x python-2.7 deque
2个回答
1
投票

来自documentation of the api

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.