python高階執行緒 條件鎖的應用

2021-09-03 03:01:17 字數 2601 閱讀 9144

簡單的描述:在實現執行緒間通訊時,使用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...