处理FIFO队列但是如果项目太旧则丢弃项目

时间:2012-12-14 20:45:24

标签: python multithreading python-2.7

我写了一个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的新手,所以如果有一个完全符合逻辑的数据类型,请随时称我为菜鸟并向我发送正确的方向。

2 个答案:

答案 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()来电是否可以阻止