2013-04-21 82 views
2

我什麼時候可以使用dummy_threadingdummy_threading是做什麼的?

我曾經以爲在系統級線程不可用於Python的情況下,它可能會用模擬線程替換系統級線程。

但是當我運行此:

import dummy_threading as threading 

semaphore = threading.Semaphore() 
def f(i): 
    semaphore.acquire() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
for _ in xrange(10): 
    semaphore.release() 

我得到0,並且程序不會終止。不僅如此,Python還是不知不覺地繼續咀嚼我的電腦內存,直到它沒有任何東西離開。

當我運行此:

import threading 

semaphore = threading.Semaphore() 
def f(i): 
    semaphore.acquire() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
for _ in xrange(10): 
    semaphore.release() 

我得到0 1 3 5 7 9 2 4 6 8預期。我需要誤解dummy_threading。我什麼時候可以使用它?

僅供參考,我在Windows 7和Fedora 18上進行了比較,並得到了相同的結果。

編輯:但是,以下給出0 1 2 3 4 5 6 7 8 9

import dummy_threading as threading 

event = threading.Event() 
def f(i): 
    event.wait() 
    print i 
for i in xrange(10): 
    threading.Thread(target=f, args=(i,)).start() 
event.set() 

的一大問題是:什麼dummy_threading,或者當將它給予相同的行爲threading

回答

3

該模塊旨在用於threadthreading在您的平臺上不可用。

您傳遞給它的函數被同步調用,您立即調用.start()。第一個函數獲取semphore,打印,然後第二個函數被調用並阻塞。它同步運行並且永不返回。

dummy_thread documentation

要小心,不要使用這個模塊,其中僵局可能會從一個線程被創建,以創建等待另一個線程塊的發生。這通常會在阻止I/O時發生。

,並從EFF-bot post(否則短,缺少一個工作環節):

助手,使其更容易編寫使用如果支持線程的代碼,但仍對Python的版本上運行的不支持線程。虛擬模塊只是按順序運行線程。

注意使它更容易部分;如果沒有實際的線程,您不能期望代碼在dummy_threading下運行時不會像您的示例中那樣執行死鎖。

+0

'dummy_threading'是否打算給出類似的結果?因爲似乎沒有工作,根據我的例子。 – 2013-04-21 17:42:59

+0

@PaulDraper:它的目的是使API看起來相同,而不實際執行線程。 – 2013-04-21 17:54:52

2

dummy_threading中,線程只是函數包裝器,它們是按順序執行的。

第二個代碼段的問題是dummy_threading.Thread.start()不會返回,直到相應的f調用退出。線程0將獲取信號量,然後線程1將嘗試獲取它並阻止。而且什麼都不會釋放信號量,因爲只有一個被阻塞的線程。

更新:做了一些關於虛擬事件行爲的研究。

事實上,所有的SemaphoreEventCondition等在dummy_threading是完全一樣的正常threading不同之處在於他們使用假鎖(有此做了一些進口的魔法。)因此,當你打電話event.wait(),底層的鎖永遠不會阻塞線程。無論塊鎖由Semaphore使用,但在內部信號的循環,直到資源可用:

while self.__value == 0: # Here it will loop forever 
    if not blocking: 
     break 
    .... 
    self.__cond.wait() 

我認爲,虛擬事件違反了假設,每當wait不帶參數調用返回時,它意味着事件設置,但不知道這是否可以輕鬆幫助。

+0

如果我用'Event'替換'Semaphore',它可以工作,但我會想象出現這種情況會出於同樣的原因,不是嗎? – 2013-04-21 17:56:41

+0

@PaulDraper顯然,虛擬'Event'中有一些特性,即使沒有設置,wait也不會阻塞(在這種情況下,它返回符合API的False)。我認爲,這對於信號量有所不同,因爲它具有非阻塞「獲取」的明確方式。 – bereal 2013-04-21 18:12:16

+0

'dummy_threading'中的特點是嗎?因爲'threading' API描述是:「阻塞直到內部標誌爲真,如果內部標誌爲真,則立即返回,否則阻塞直到另一個線程調用set()將標誌設置爲true,或者直到可選超時發生。「 – 2013-04-21 18:14:53