间歇连接的队列大小和阻塞

这个问题是关于Python队列(来自队列模块)在达到最大大小后如何工作,但其他项仍继续出现在输入中。

我正在研究一个Python程序,该程序从多个串行端口读取数据,将数据划分为多个队列,并提供一个TCP套接字服务器,该服务器接受多个端口上的连接,每个端口提供一个队列。该程序的工作方式如下:

  • 四个串行端口线程中的每一个都连续将两个通道的数据转储到一个公共输入队列中(每秒总共八个25-30个字符记录)。

  • 另一个线程get()s输入队列并将数据分成9个输出队列(每个通道一个,再加上一个包含所有通道的队列)。

  • 然后,在建立连接的九个套接字线程中,每个线程都从队列中获取数据并将其发送到客户端。

令人惊讶的是,我的代码似乎可以运行,但是我想确保它的健壮性。令人担忧的是,串行端口正在连续输出数据,但是从队列中提取数据的客户端连接是间歇性的。

在这种情况下,客户端连接时输出是什么样的?队列的内容将立即发送,但是一旦旧数据消失了怎么办?例如,如果队列大小为10,但生产者线程在没有get()调用的情况下将1000个项目泵入了队列,那么一旦消耗了十个项目,下一个结果是-项目11还是项目1001?换句话说,是从队列被阻塞以来到达的项目被扔掉了,下一次插入是有空时到达的第一个数据,还是按顺序插入它们?

我已经尝试了一些测试,但我能确定的是,如果队列大小设置得太小,我会得到初始输出,然后最终(在超时时间之后)程序以“队列终止”。空”消息。如果队列大小设置为1000左右,则该程序似乎可以连续运行,但是很难判断我是否丢失了数据。

如果我丢失了最旧的样本,也可以,但是我不能留有空白-项目10后面必须跟项目11,而不是项目1001。队列机制是这样工作的,还是我需要做一些事情确保这种行为? (我想队列的大小可以是无限的,但是我怀疑在程序运行了一段时间后,这可能还会引起其他问题。)

谢谢!

hualushui1129 回答:间歇连接的队列大小和阻塞

正在帮助自己...

摘要:当队列已满时,您要么(a)阻塞,将所有内容拖到上游,要么(b)在地板上扔新的输入,直到有空为止。

首先,我的程序在一段时间(可变)后停止。当未读取的输出队列之一填满时,就会发生这种情况。通过在将项目放入队列之前进行测试可以解决此问题:

$action['index']

如果队列已满,则将新物品放在地板上。当您开始从队列中提取数据时,您将获得队列中的内容直到其被填满为止,然后在有空间的情况下获取新数据。这是一个问题,因为我需要在输出中提供不间断的项目序列。

要解决此问题,我在读取数据之前清空队列:

if not q.full():
    q.put(item)

我丢失了旧的排队数据(但是在我的应用程序中没关系),现在我得到了无间隙的顺序输出。

本文链接:https://www.f2er.com/3151243.html

大家都在问