我写了一个basic utility来监听一个线程中的消息,将它们添加到FIFO队列中并在另一个线程中处理它们。每个消息都需要一个固定的时间来处理(它正在等待闪烁的灯停止闪烁),但是消息可以随机到达(代码中的patterns
是正则表达的字典,以匹配传入的消息,如果匹配是发现它将它添加到队列中以及闪烁的颜色模式。)
blink_queue = Queue()
def receive(data) :
message = data['text']
for pattern in patterns:
if re.match(pattern, message):
blink_queue.put(patterns[pattern])
break
return True
def blinker(q) :
while True:
args = q.get().split()
subprocess.Popen(
[blink_app] + args,
startupinfo=startupinfo,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
time.sleep(blink_wait)
q.task_done()
def subscribe():
print("Listening for messages on '%s' channel..." % channel)
pubnub.subscribe({
'channel' : channel,
'callback' : receive
})
blink_worker = Thread(target=blinker, args=(blink_queue,))
blink_worker.daemon=True
blink_worker.start()
sub_thread = Thread(target=subscribe)
sub_thread.daemon=True
sub_thread.start()
sub_thread.join()
如何在Python中实现FIFO队列,如果它变得很大,它会自动修剪最旧的(第一个)队列。我是否创建另一个观看线程,或者我是否在subscribe
线程中检查大小?我是Python的新手,所以如果有一个完全符合逻辑的数据类型,请随时称我为菜鸟并向我发送正确的方向。
答案 0 :(得分:4)
原来有一个逻辑类型collections.deque
。来自文档:
如果未指定maxlen或为None,则deques可能会增长为任意值 长度。否则,双端队列将限制为指定的最大值 长度。一旦有限长度双端队列已满,当添加新项目时, 从对端丢弃相应数量的项目。
(here是实现此数据类型的提交)
答案 1 :(得分:0)
为此,我会继承Queue并重载put
方法,以便在Queue
过大时以您想要的方式删除项目。
e.g。
class NukeOldDataQueue(Queue.Queue):
def put(self,*args,**kwargs):
if self.full():
try:
oldest_data = self.get()
print('[WARNING]: throwing away old data:'+repr(oldest_data))
# a True value from `full()` does not guarantee
# that anything remains in the queue when `get()` is called
except Queue.Empty:
pass
Queue.Queue.put(self,*args,**kwargs)
您可能还想传递block=False
参数或操纵timeout
参数,具体取决于意外丢弃新数据的严重程度或put()
来电是否可以阻止