2016-09-20 31 views
0

Python threading documentation列出了生產者的下面的例子:我應該在鎖定狀態下還是在釋放後通知?

from threading import Condition 
cv = Condition() 

# Produce one item 
with cv: 
    make_an_item_available() 
    cv.notify() 

我必須重新審視線程我看着the C++ documentation, which states

的通知線程並不需持相同的互斥鎖 作爲等待線程所持有的;實際上這樣做是一個 悲觀化,因爲通知的線程會立即再次阻止 ,等待通知線程釋放鎖定。

那建議做這樣的事情:

# Produce one item 
with cv: 
    make_an_item_available() 
cv.notify() 

回答

2

不要讀C++文檔來了解Python中的API。每the actual Python docs

如果在調用此方法時調用線程未獲取鎖,則會引發RuntimeError

Python明確要求保持鎖而notify ing。

+0

哦,我錯過了。消費者不會立即封鎖嗎? –

+1

@ NeilG:是的,但無論如何(大部分時間)都會發生,他們需要[GIL](https://wiki.python.org/moin/GIL)甚至再次開始執行,而'notify'不釋放GIL。調用'notify'的線程將完成其時間片(假設他們在Condition的'with'塊尾部調用'notify',通常給它釋放'Condition'的時間),然後釋放GIL,此時'通知'線程喚醒,並希望獲得GIL和'Condition'。其他線程首先獲取GIL可能需要一些時間。 – ShadowRanger

+0

有道理,謝謝。 –

相關問題