如何创建一个按时间间隔逐项弹出内容的队列,而不暂停程序?
我需要创建一个队列,可以在指定的时间间隔内取出里面的项目。
这里有个重点:这个操作应该在后台进行,这样就不会阻止程序的运行,直到队列里的东西都取完为止。
目前我的队列是这样的:
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()和实际从队列取项目之间被清空,线程不会一直卡在那里等下去。