如何创建一个按时间间隔逐项弹出内容的队列,而不暂停程序?

0 投票
1 回答
722 浏览
提问于 2025-04-17 08:30

我需要创建一个队列,可以在指定的时间间隔内取出里面的项目。
这里有个重点:这个操作应该在后台进行,这样就不会阻止程序的运行,直到队列里的东西都取完为止。
目前我的队列是这样的:

from collections import deque

class Queue():

    def __init__(self, sec):
        self.sec = sec
        self.q = deque()
        # start a timer that triggers
        # pop_item() every 'sec' seconds

    def add_item(self, item):
        self.q.append(item)

    def pop_item(self):
        item = self.q.popleft()
        print(item)

q1 = Queue(5)
q1.add_item('A')
q1.add_item('B')
q1.add_item('C')

在这个例子中,我创建了一个新的队列(q1),时间间隔是5秒,并添加了3个项目。
一旦q1被创建,它就应该每5秒输出一次内容,而不会暂停程序的运行。
这个队列不止一个实例,会有很多实例,每个实例都有自己输出内容的时间间隔。

我目前能做到的只是一个会暂停主程序的计时器,所以这不是我需要的。

有没有人能给我建议解决这个问题的方法?

谢谢。

1 个回答

1

就像评论你问题的那两个人说的,最直接的解决办法就是使用线程。不过,当你提到会有很多实例时,这个“很多”要在合理的范围内。可以参考下面的代码:

import threading
import Queue
import time

class QueuePrinter(threading.Thread):
  def __init__(self, qu, *args, **kwargs):
    super(QueuePrinter, self).__init__(*args, **kwargs)
    self.qu = qu
  def run(self):
    while not self.qu.empty():
      item = self.qu.get()
      print item
      time.sleep(2)

qu = Queue()
printer = QueuePrinter(qu)
qu.put('String1')
qu.put('String2')
#etc...
printer.start()
qu.join()

你需要在这个基础上稍微改进一下;这些是你应该遵循的基本原则。具体来说,你需要修改run()方法,让它能正确运行,同时在里面调用的队列的get()方法也要注意,因为Queue.get是一个阻塞调用,它会一直等到能取到一个项目。

使用self.qu.get(timeout=100)会抛出一个异常,但这意味着如果队列在self.qu.empty()和实际从队列取项目之间被清空,线程不会一直卡在那里等下去。

撰写回答