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()
哦,我錯過了。消費者不會立即封鎖嗎? –
@ NeilG:是的,但無論如何(大部分時間)都會發生,他們需要[GIL](https://wiki.python.org/moin/GIL)甚至再次開始執行,而'notify'不釋放GIL。調用'notify'的線程將完成其時間片(假設他們在Condition的'with'塊尾部調用'notify',通常給它釋放'Condition'的時間),然後釋放GIL,此時'通知'線程喚醒,並希望獲得GIL和'Condition'。其他線程首先獲取GIL可能需要一些時間。 – ShadowRanger
有道理,謝謝。 –