2011-11-16 32 views
4

Python中是否可以有一个公平的信号量,它可以保证阻塞线程按照他们所谓的acquire()的顺序被解除阻塞?Python中的公平信号量

回答

5

您可能需要从其他运动部件构建一个。例如,创建一个Queue.Queue(),每个听众发布一个全新的Event(),然后等待。当需要唤醒其中一个等待线程时,弹出队列中等待时间最长的项目 - 它将成为这些事件对象之一 - 并通过event.set()释放线程。很显然,你也可以在等待进程中使用信号量,但是我喜欢Event的语义,因为它明显只会发生一次,而信号量的语义是它的值可以支持许多等待线程。

要设置系统启动:

import Queue 
big_queue = Queue.Queue() 

然后,等待:

import threading 
myevent = threading.Event() 
big_queue.put(myevent) 
myevent.wait() 

并释放等待线程:

event = big_queue.get() 
event.set() 

我想的弱点这种方法是,执行set/release的线程必须等待一个等待的线程出现,而一个真正的semap即使没有人等待,Hore会让几个发布进行下去吗?

+0

我们能否没有克服你所说的某种限制?这不可能吗? –

+1

我在想它!出于好奇,为什么 - 如果等待的线程是对称的 - 会有一个“公平”的信号量甚至是可取的吗?随着内存缓存如何在现代操作系统上运行,激活* most *最近活动的线程应该是最有效的,而不是等待时间最长的线程,因此从处理器缓存中有最大的内存块失效甚至从主内存中。是不是一个公平的信号量,因此是反模式? :) –

+0

+1很好的答案和使用更高级别的线程工具来推断互斥的一个很好的例子。 –