您好,登錄后才能下訂單哦!
Python中Condition如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
Condition 算是 Lock 和 Event 的雜交版本,除了作為 Lock 的基本功能外,還提供了 wait() 和 notify() 作為線程間 "消息通知"。
from threading import * from time import * condi = Condition() def t1(): condi.acquire() try: for i in range(10): print currentThread().name, i sleep(1) if (i == 4): condi.wait()
# wait() 釋放鎖,并進(jìn)入等待狀態(tài)。直到接收到 notify() 發(fā)送的消息后再次試圖獲取鎖,繼續(xù)后續(xù)代碼執(zhí)行。
finally: condi.release() def t2(): condi.acquire() try: for i in range(10): print currentThread().name, i sleep(1) finally: condi.notify()
# 在釋放鎖前通知等待的線程準(zhǔn)備起床。
condi.release() Thread(target=t1).start() Thread(target=t2).start()
輸出:
$ ./main.py Thread-1 0 Thread-1 1 Thread-1 2 Thread-1 3
Thread-1 4 <--- Thread1 釋放鎖,開始等待。Thread-2 0 <--- Thread2 獲得鎖,開始執(zhí)行。
Thread-2 1 Thread-2 2 Thread-2 3 Thread-2 4 Thread-2 5 Thread-2 6 Thread-2 7 Thread-2 8
Thread-2 9 <--- Thread2 發(fā)送通知,并釋放鎖。Thread-1 5 <--- Thread1 收到消息,再次拿到鎖,開始未完成的工作。
Thread-1 6 Thread-1 7 Thread-1 8 Thread-1 9
wait() 實際可以分解為 "condi.release(); ... acquire()" 這兩個動作。我們可以使用 Condition 包裝已有的鎖,當(dāng)然也可以用 with/as 來改善我們的代碼。
lock = RLock() condi = Condition(lock) def t1(): with condi: for i in range(10): print currentThread().name, i sleep(1) if (i == 4): condi.wait() def t2(): with lock: for i in range(10): print currentThread().name, i sleep(1) condi.notify() Thread(target=t1).start() Thread(target=t2).start()
注意調(diào)用 notify() 和 notifyall() 的線程必須事先獲得鎖,否則會拋出異常。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。