簡單的描述:在實現執行緒間通訊時,使用condition 可以讓雙方你一句我一句的傳送訊息,即等待乙個人說完後,另乙個人才可以接著說。附源**實現的原理:python中threading 模組中condition類中實現了notify() 和wait() 的方法,也就是解鎖,和獲得鎖的過程。
下面通過一段簡單的**來更好的理解。
import threading
""""
簡單的對話
小愛 : 你好
天貓 : 在呢
小愛 : 我愛你
天貓 : 我也愛你
"""class
xiaoai
(threading.thread)
: def __init__
(self,codn)
:super
(xiaoai,self)
.__init__
(name=
'小愛'
) self.codn = codn
def run
(self)
:with self.codn:
**使用with建立乙個rlock
,同時也使**更清晰**
print
("{} : 你好"
.format
(self.name)
) self.codn.
notify()
self.codn.
wait()
print
("{} : 我愛你"
.format
(self.name)
) self.codn.
notify()
class
tianao
(threading.thread)
: def __init__
(self,codn)
:super
(tianao, self)
.__init__
(name=
'天貓'
) self.codn = codn
def run
(self)
:with self.codn:
print
("{} : 在呢"
.format
(self.name)
) self.codn.
notify()
self.codn.
wait()
print
("{} : 我也愛你"
.format
(self.name)
)if __name__ ==
"__main__"
: codn = threading.
condition()
xiaoai =
xiaoai
(codn)
tianmao =
tianao
(codn)
xiaoai.
start()
tianmao.
start()
tianmao.
join()
xiaoai.
join()
控制台輸出的結果,實現了簡單的條件對話
小愛 : 你好
天貓 : 在呢
小愛 : 我愛你
天貓 : 我也愛你
process finished with exit code 0
notify
()的實現原理: 釋放wait
()建立的鎖,也就是開啟中斷,開始執行該執行緒
if not self.
_is_owned()
: raise runtimeerror
("cannot notify on un-acquired lock"
)#這句**說明是在有鎖的情況下,否則丟擲異常
all_waiters = self._waiters
waiters_to_notify =
_deque
(_islice
(all_waiters, n))**
使用deque
()方法建立乙個類似於列表的物件,可對列表的端點進行操作**
if not waiters_to_notify:
return
for waiter in waiters_to_notify:
waiter.
release()
**釋放鎖**
try:
all_waiters.
remove
(waiter)
**從等待的列表中移除乙個等待的元素,提高了效率**
except valueerror:
pass
wait()
分析:可以理解為關閉中斷,獲得了鎖,進入了阻塞狀態。直到發出notify
()的訊號,才繼續執行該執行緒。
Java JUC 高階執行緒之十一 執行緒八鎖
乙個物件裡面如果有多個synchronized方法,某一時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,某一時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法 鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件的...
python多執行緒鎖 python的多執行緒程式設計之鎖
1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...
多執行緒的互斥鎖和條件變數
執行緒間的互斥的同步一直是乙個很重要的地方,在這裡做個總結 所用的介面 int pthread create pthread t thread,const pthread attr t attr,void start routine void void arg void pthread exit v...