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