我想使用Python 2.7多处理包来处理无穷无尽的数据流。子进程将不断通过TCP / IP或UDP数据包接收数据,并立即将数据置于多处理.Queue中。但是,在某些时间间隔(例如,每500毫秒),我只想操作用户指定的此数据片段。比方说,最后200个数据包。
我知道我可以在队列上放置()和get(),但是如何在没有a的情况下创建该数据片段?备份队列和b)保持线程安全?
我想我必须不断地从队列中获取()并使用另一个子进程来防止队列变满。然后我必须将数据存储在另一个数据结构(例如列表)中以构建用户指定的切片。但数据结构可能不是线程安全的,因此听起来不是一个好的解决方案。
是否有一些编程范式能够轻松实现我想要做的事情?我查看了multiprocessing.Manager类,但不确定它是否可行。
答案 0 :(得分:0)
您可以按照以下方式执行此操作:
使用threading.Lock
类的实例。调用方法acquire
以声明从某个线程对您的队列进行独占访问,并调用release
以授予其他线程访问权。
由于您希望继续收集输入,因此复制整个队列可能会非常昂贵。可能最快的方法是首先在一个队列中收集数据,而不是将其交换为另一个队列,并使用旧的数据通过不同的线程将数据读入应用程序。使用Lock实例保护交换,因此您可以确保只要编写器获得锁定,当前的“侦听器”队列就可以接收数据了。
如果只有最近的数据很重要,请使用两个循环缓冲区而不是队列,以便覆盖旧数据。