安全吗?

2024-10-02 00:26:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在读关于CPython的collections.dequehere和{a2}的线程安全性。我知道.append().popleft()操作在线程间相互配合很好,.appendleft()和{}也一样。在

我的问题是:在.popleft().clear()之间是否同样适用?否则,在.popleft().pop()之间?我的情况是,我有一个消费者线程,称之为a,不断地.popleft()来自a dequed的项目,而生产线程B在右侧.append()为它们提供服务。在某些时候,我希望线程B能够说“取消所有挂起的项目”。如果我这么做

d.clear()

它是否会因为与线程A的.popleft()操作冲突而导致未定义的行为?如果我说:

^{pr2}$

相反呢?在


Tags: 项目a2情况消费者cpython线程popcollections
2条回答

documentation of the api

Deques support thread-safe, memory efficient appends and pops from either side of the deque with approximately the same O(1) performance in either direction (emphasis mine)

也就是说,你可以在任何一方都能享受到好处。至于clear()方法,只能通过查看实现来确定,但我假设它的实现方式与您建议的相同。在

编辑: 另外,如果我从阻塞队列的java实现中正确地记得,对于所有预期的目的,它应该相当接近这个实现,那么对队列对象调用clear()并不能保证当您在下一个代码行访问它时,会发现它是空的

如果我记得的话,它们不应该干扰您正在尝试的操作,因为它们将在资源上放置一个互斥锁,并独立地执行任何操作,只要您在尝试弹出时从资源中捕捉到一个异常(如果它是空的),您就可以开始了。在

相关问题 更多 >

    热门问题