Python SimpleQueue 不公平

问题描述 投票:0回答:1

Python标准库提供了两种线程安全的实现

SimpleQueue

  1. A 纯C实现
  2. 后备Python实现,IIUC以防Cython不存在(并且因为显然它的政策也提供纯Python实现)

为了了解更多信息,我正在查看这两种实现的代码。其中,我了解到 C 实现是可重入的,而 Python 实现则不是。

但是,Python 实现代码中的注释让我很困惑:

注意:虽然这个纯Python版本提供了公平性 (通过使用 threading.Semaphore 本身是公平的,基于 on threading.Condition),公平性不是 API 契约的一部分。 这允许 C 版本使用不同的实现。

线程安全的“先进先出队列”怎么会不公平呢?难道“公平”不是从定义上就保证了,因为它首先是先进先出的吗?

另外,这以什么方式“允许”C 版本使用不同的实现?我觉得措辞很混乱。这是否意味着这在某种程度上被定义为“可能不公平的 FIFO 队列”,并且反映在 C 实现中?还是别的什么?

python queue cython python-multithreading
1个回答
0
投票

混乱源于队列上下文中线程安全性和公平性之间的区别。

线程安全确保对共享数据结构(如队列)的并发访问不会导致数据损坏或意外行为。对于 FIFO 队列,线程安全性可确保多个线程可以将项目入队和出队,而不会导致竞争条件或破坏队列内部状态等问题。

另一方面,公平性是指线程访问共享资源的顺序。公平队列可确保线程按特定顺序(例如先来先服务)获取对队列的访问权限,这可能与简单的 FIFO 顺序不同。公平并不能保证线程安全;这是关于访问共享资源的线程的调度或顺序。

关于您在

SimpleQueue

 的 Python 实现中提到的评论,需要强调的是,尽管 Python 版本使用了公平机制(基于 
threading.Semaphore
threading.Condition
),但队列行为的公平性并未记录在案。 API 合同。本质上,虽然由于实现细节(使用公平信号量)可能会观察到公平性,但 Python 标准库并不保证公平性作为 
SimpleQueue
 官方行为的一部分。

关于允许 C 版本使用不同实现的评论意味着,由于公平性不是 API 合约的保证部分,

SimpleQueue

 的 C 实现可能会选择使用不同的方法,牺牲公平性以支持其他优化或要求。这意味着 C 版本可能会使用不同的内部机制来实现线程安全,而无需严格遵守访问队列的线程的公平顺序。

总而言之,这种混乱可能源于线程安全(确保共享数据结构不损坏)和公平性(确保线程访问的特定顺序)之间的区别。虽然 FIFO 队列本质上是有序的,但它不能保证线程调度方面的公平性,并且 Python 实现的公平性也不是 API 契约的保证部分,允许不同实现灵活地优先考虑性能或资源利用率等其他方面.

© www.soinside.com 2019 - 2024. All rights reserved.