gpt4 book ai didi

python - 从 python 的 Queue.Queue 中删除最旧的项目(同步)

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:42 24 4
gpt4 key购买 nike

我能否配置 Queue.Queue,使其始终接受新项目,并在队列已满时简单地丢弃最旧的项目?

如果没有,标准库中是否有另一个队列类可以做到这一点?

(我不能使用双端队列,因为我有一个需要同步的生产者/消费者设置。)

最佳答案

使用条件保护资源访问的示例,就像我在评论中所说的那样。

import collections
import threading
import time

queue = collections.deque()
condition = threading.Condition()

def consumer():
condition.acquire()
while True:
while queue:
item = queue.popleft()
condition.release()
# do something with item
print(item)
condition.acquire()
condition.wait()

def push_item(item):
with condition:
queue.append(item)
condition.notify()

# From that point forward, it is just demonstration code to show how to use

def example_producer_thread(*args):
for arg in args:
push_item(arg)

consumer_thread = threading.Thread(target=consumer, name='queue consumer')
consumer_thread.daemon = True # so it does not prevent python from exiting
consumer_thread.start()

for example in [range(0, 10), range(10, 20), range(20, 30)]:
threading.Thread(target=example_producer_thread, args=example).start()

time.sleep(1) # let the consumer thread some time before the script gets killed

核心在这里:

  • consumer() 是一个消费者线程,它保持空闲(无轮询)直到其他线程将项目放入队列中。当被唤醒时,它将锁定队列,获取一个项目,解锁队列,处理项目,直到队列中没有项目。然后它释放它并重新进入休眠状态。
  • push_item() 将单个项目推送到队列中,并通知消费者线程它应该唤醒。

剩下的只是让它成为一个工作示例。 example_producer_thread 只会将其参数插入队列。我们开始其中三个,每个都对一系列数字进行操作,以便我们可以看到结果。

只需将 maxlen 添加到队列中即可。也许在使用时将功能封装在一个小类中。

关于python - 从 python 的 Queue.Queue 中删除最旧的项目(同步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com