【发布时间】:2019-11-06 14:48:35
【问题描述】:
这个问题是关于 Python 队列(来自 queue 模块)在达到最大大小但其他项目继续出现在其输入端时如何工作的。
我正在开发一个 Python 程序,该程序从多个串行端口读取数据,将数据划分为多个队列,并提供一个 TCP 套接字服务器,该服务器接受多个端口上的连接,每个端口服务一个队列。该程序的工作原理如下:
四个串行端口线程中的每一个都将两个通道的数据连续转储到一个公共输入队列中(总共 8 个 25-30 字符记录/秒)。
另一个线程获取()输入队列并将数据分成九个输出队列(每个通道一个,加上一个包含所有通道)。
然后,九个套接字线程中的每一个,当建立连接时,从其队列中获取()数据并将其发送到客户端。
令人惊讶的是,我的代码似乎可以工作,但我想确保它是健壮的。一个问题是串行端口持续输出数据,但从队列中提取数据的客户端连接是间歇性的。
在这种情况下,客户端连接时的输出是什么样的?队列的内容会立即发送,但是一旦旧数据消失了怎么办?例如,如果队列大小为 10,但生产者线程在没有 get() 调用的情况下已将 1000 个项目泵入其中,那么一旦消耗了 10 个项目,接下来会出现什么 - 项目 11 或项目 1001?换句话说,队列阻塞后到达的项目是否被丢弃,下一次插入是一旦有空间到达的第一个数据,还是按顺序插入?
我已经尝试了一些测试,我所能确定的是,如果队列大小设置得太小,我会得到初始输出,然后最终(在超时期限之后)程序以“队列空”消息。如果队列大小设置为 1000 左右,程序似乎在连续运行,但很难判断我是否丢失数据。
如果我丢失了最旧的样本也没关系,但我不能有间隙——第 10 项后面必须跟第 11 项,而不是第 1001 项。队列机制是否以这种方式工作,或者我需要做些什么确保这种行为? (我想队列大小可能是无限的,但我怀疑在程序运行一段时间后可能会导致其他问题。)
谢谢!
【问题讨论】:
标签: python multithreading queue