多线程 - 覆盖队列中的旧值?

use*_*971 4 python queue multithreading

我有两个线程:生产者和消费者。生产者定期获取信息并将其提供给消费者。消费者只需要最新的信息副本,并且会不定期地检查它,可能会间隔很长时间。

促进这种交流的最简单机制似乎是创建一个Queue.Queue(maxsize=1). 但是,如果生产者在消费旧信息之前获取新信息,它将阻塞,直到消费者首先使用过时的信息。生产者有没有办法覆盖旧信息?

有没有更好的线程安全机制来实现这一点?

use*_*971 6

谢谢斯尼尔德·多尔科。你的建议很有价值。在做进一步的研究时,我确实找到了一种似乎适用于我的特定情况的机制。Acollections.deque([iterable[, maxlen]])将是线程安全的,在接受新数据时丢弃旧数据,并根据文档

它们还可用于跟踪仅对最近的活动感兴趣的交易和其他数据池。

使用 amaxlen=1生产者将始终能够写入新数据。当消费者执行 a 时pop(),它将始终获得最新数据。如果 aIndexError被引发,表明 deque 是空的,消费者将继续使用它上次收到的数据。


Sni*_*kow 5

最简单的解决方法可能是让生产者在放置之前消耗其旧值(如果有)。您可以Queue.get_nowait()为此使用。

在风格上,我不太热衷于将 Queue 用于仅打算容纳一个对象的东西。一个普通的 Lock + 一个引用变量将使代码的作用更加明显。

  • 在这种情况下,消费者会阻塞在空队列上,将 CPU 交还给生产者。然后生产者将执行“put”,之后消费者将能够继续。 (3认同)