【问题标题】:Queue size and blocking for intermittent connections间歇连接的队列大小和阻塞
【发布时间】: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


    【解决方案1】:

    回答自己...

    总结:当队列已满时,您要么必须 (a) 阻塞、停止上游的所有内容,要么 (b) 将新的输入扔到地板上直到有空间。

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

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

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

    为了解决这个问题,我在读出数据之前清空了队列:

    while not q.empty():
        line = q.get()    # toss this
    while True:
        line = q.get()
        conn.send(line)
        q.task_done()
    

    我丢失了旧的排队数据(但这在我的应用程序中是可以的),现在我得到了没有间隙的连续输出。

    【讨论】:

      猜你喜欢
      • 2014-10-16
      • 2016-07-18
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多