提问人:Luigi D. 提问时间:11/17/2023 最后编辑:Luigi D. 更新时间:11/17/2023 访问量:59
Python SimpleQueue 不公平
Python SimpleQueue not fair
问:
Python 标准库为线程安全提供了两种实现:SimpleQueue
我正在浏览这两个实现的代码,以便了解更多信息。其中,我了解到 C 实现是可重入的,而 Python 实现则不是。
但是,从 Python 实现代码中的注释中可以看出,有些事情让我感到非常困惑:
注意:虽然这个纯 Python 版本提供了公平性 (通过使用线程。信号量本身是公平的,基于 在线程上。条件),公平性不是 API 合约的一部分。 这允许 C 版本使用不同的实现。
线程安全的“FIFO队列”怎么可能不公平?“公平性”不是由定义来保证的,因为它首先是FIFO吗?
另外,这以什么方式“允许”C版本使用不同的实现?我觉得措辞很混乱。这是否意味着这在某种程度上被定义为“可能不公平的FIFO队列”,这反映在C实现中?还是别的什么?
答:
这种混淆源于队列上下文中线程安全性和公平性之间的区别。
线程安全可确保对共享数据结构(如队列)的并发访问不会导致数据损坏或意外行为。对于 FIFO 队列,线程安全可确保多个线程可以对项目进行排队和取消排队,而不会导致争用条件或损坏队列的内部状态等问题。
另一方面,公平性是指线程访问共享资源的顺序。公平的队列可确保线程以特定顺序(例如先到先得)访问队列,这可能与简单的 FIFO 排序不同。公平并不能保证线程安全;它是关于访问共享资源的线程的调度或排序。
关于您在 Python 实现中提到的注释,它强调尽管 Python 版本使用了公平机制(基于),但队列行为的公平性并不是 API 合约中记录的部分。从本质上讲,虽然由于实现细节(使用公平的信号量)可能会观察到公平性,但 Python 标准库并不能保证公平性作为 .SimpleQueue
threading.Semaphore
threading.Condition
SimpleQueue
关于允许 C 版本使用不同实现的评论意味着,由于公平性不是 API 合约的保证部分,因此 C 实现可能会选择使用不同的方法,牺牲公平性以支持其他优化或要求。这意味着 C 版本可能会使用不同的内部机制来实现线程安全,而无需严格遵守访问队列的线程的公平顺序。SimpleQueue
总之,这种混淆可能源于线程安全(确保共享数据结构不会损坏)和公平性(确保线程访问的特定顺序)之间的区别。虽然 FIFO 队列本质上是有序的,但它不能保证线程调度方面的公平性,而且 Python 实现的公平性也不是 API 协定的保证部分,这允许不同的实现灵活地优先考虑其他方面,如性能或资源利用率。
评论