我有一个简单的线程,它从蓝牙RFCOMM(类似串口)套接字中抓取字节并将它们转储到 Queue.Queue (FIFO)中,这似乎是交换的典型方法线程之间的数据。工作正常。

这是否过度杀伤?我可以使用bytearray然后让我的读者线程 .append(somebyte)和处理函数只是 .pop(0)?我不确定Queue中的保护是否适用于更复杂的“多生产者,多消费者队列”。并且浪费点对点字节流。使用队列与更简单的数据类型相比,像刷新队列或抓取多个字节这样的事情看起来更尴尬。

我想答案可能与 .pop()是原子的有关,但它会不会重要呢?...

有帮助吗?

解决方案

使用 Queue ,您保证在任何实现和Python版本中都是线程安全的。依赖于某种其他对象的这种或那种方法是“原子的”。 (在给定的实现和版本中)通常会让您受到这种“原子性”的支配。不是一个强有力的保证(只是特定点发布和你正在使用的实现工件),因此任何升级或端口到其他Python实现都会引入微妙的,非常难以调试的竞争条件。

如果您的分析告诉您 Queue 的强大且一般的保证是您的特定生产者 - 消费者用例的瓶颈,那么使您自己更简单的保证为线程安全的FIFO队列/流。例如,如果您发现(除了竞争条件) append pop 将非常适合您的使用,只需创建一个用锁来保护每个人的类获取/发布(使用 with 语句) - Queue 增加了微不足道的开销,以支持多个生产者和消费者,你可以减少这几纳秒! - )

其他提示

是的,pop()是原子的,但如果性能不是非常重要,我会坚持使用Queue。

如果输入速率足够快,您可以在将字节推送到队列之前将字节缓冲到字符串中。这可能会通过减少锁定量来增加吞吐量,但代价是接收端会有一点额外的延迟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top