2011-11-16 31 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很好的答案和使用更高級別的線程工具來推斷互斥的一個很好的例子。 –