Python 处理FIFO队列,但如果项目太旧,则丢弃它们

Python 处理FIFO队列,但如果项目太旧,则丢弃它们,python,multithreading,python-2.7,Python,Multithreading,Python 2.7,我编写了一个函数,它在一个线程中侦听消息,将它们添加到FIFO队列,并在另一个线程中处理它们。每个消息都需要固定的处理时间(它正在等待闪烁的灯光停止闪烁),但消息可以随机到达(代码中的模式是与传入消息匹配的正则表达式字典,如果找到匹配项,它会将其与要闪烁的颜色模式一起添加到队列中) 如何在Python中实现FIFO队列,以便在最旧(第一个)队列变大时自动修剪它。我是创建另一个监视线程,还是在subscribe线程上检查大小?我对Python非常陌生,因此如果有完全逻辑的数据类型,请随意称我为no

我编写了一个函数,它在一个线程中侦听消息,将它们添加到FIFO队列,并在另一个线程中处理它们。每个消息都需要固定的处理时间(它正在等待闪烁的灯光停止闪烁),但消息可以随机到达(代码中的
模式
是与传入消息匹配的正则表达式字典,如果找到匹配项,它会将其与要闪烁的颜色模式一起添加到队列中)

如何在Python中实现FIFO队列,以便在最旧(第一个)队列变大时自动修剪它。我是创建另一个监视线程,还是在
subscribe
线程上检查大小?我对Python非常陌生,因此如果有完全逻辑的数据类型,请随意称我为noob并将我发送到正确的方向。

为此,如果
队列变得太大,我将对
put
方法进行子类化和重载,以按照您希望的方式删除项

e、 g

您可能还希望传递
block=False
参数或操纵
timeout
参数,具体取决于意外丢弃新数据的严重程度或是否阻塞
put()
调用是可以接受的。

为此,如果
队列变得太大,我将对
put
方法进行子类化和重载,以按照您希望的方式删除项目

e、 g


您可能还希望传递
block=False
参数或操纵
timeout
参数,具体取决于意外丢弃新数据的严重程度,或者是否可以接受对
put()
调用的阻塞。

证明存在逻辑类型。从文件中:

如果未指定maxlen或为None,则DEQUE可能会增长为任意值 长否则,deque将限定为指定的最大值 长一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目


(并且是实现此数据类型的提交)

结果是有一个逻辑类型。从文件中:

如果未指定maxlen或为None,则DEQUE可能会增长为任意值 长否则,deque将限定为指定的最大值 长一旦有界长度deque已满,添加新项目时, 从另一端丢弃相应数量的项目


(并且是实现此数据类型的提交)

我知道这是旧的,但是如果您这样做,您应该锁定,因为在检查队列是否已满并调用
get()
,以及在这和
put()
之间,队列的状态可能会更改,但是如果您这样做,您应该锁定,因为在检查队列是否已满并调用
get()
,以及在检查队列是否已满和调用
put()
之前,队列的状态可能会发生变化
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()
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)