python執行緒互斥鎖 Python多執行緒與互斥鎖

2021-10-12 11:55:20 字數 2307 閱讀 5562

多執行緒-threading

python的thread模組是⽐較底層的模組,python的threading 模組是對thread做了⼀些包裝的,可以更加⽅便的被使⽤。

1.使⽤threading模組

from threading import thread      #匯入模組

t = thread(target = ***)          #建立執行緒例項  target = 函式名

t.start()                         #開始執行緒

說明使⽤多執行緒併發的操作,花費時間要短很多

建立好的執行緒,需要調⽤start()⽅法來啟動

主線程會等待所有的⼦執行緒結束後才結

python的threading.thread類有⼀個run⽅法,⽤於定義執行緒的功能函 數,

可以在⾃⼰的執行緒類中覆蓋該⽅法。⽽建立⾃⼰的執行緒例項後,通 過thread類的start⽅法,

可以啟動該執行緒,交給python虛擬機器進⾏調 度,當該執行緒獲得執⾏的機會時,就會調⽤run⽅法執⾏執行緒。

import threading

importtime

class mythread(threading.thread):

def run(self):

fori in range(3):

time.sleep(1)

msg="i'm"+self.name+'@'+str(i)#name屬性中儲存的是當前執行緒的

print(msg)

if __name__ =='__main__':

t = mythread()

t.start()

多執行緒程式的執⾏順序是不確定的。當執 ⾏到sleep語句時,執行緒將被阻塞(blocked),到sleep結束後,執行緒進⼊就 緒(runnable)狀態,等待排程。⽽執行緒排程將⾃⾏選擇⼀個執行緒執⾏。上 ⾯的**中只能保證每個執行緒都運⾏完整個run函式,但是執行緒的啟動順序、 run函式中每次迴圈的執⾏順序都不能確定。

總結每個執行緒⼀定會有⼀個名字,儘管上⾯的例⼦中沒有指定執行緒物件的 name,但是python會⾃動為執行緒指定⼀個名字。

當執行緒的run()⽅法結束時該執行緒完成。

⽆法控制線程排程程式,但可以通過別的⽅式來影響執行緒排程的⽅式。

執行緒的⼏種狀態:

5、多執行緒共享全域性變數,程序無法共享

在⼀個程序內的所有執行緒共享全域性變數,能夠在不適⽤其他⽅式的前提下完成多執行緒之間的資料共享(這點要⽐多程序要好)

缺點就是,執行緒是對全域性變數隨意遂改可能造成多執行緒之間對全域性變數 的混亂(即執行緒⾮安全)

為了解決共享變數混亂問題,因此引入互斥鎖:

當多個執行緒⼏乎同時修改某⼀個共享資料的時候,需要進⾏同步控制

執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引⼊互 斥鎖。

互斥鎖為資源引⼊⼀個狀態:鎖定/⾮鎖定。

某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他 執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「⾮鎖定」,其他的 執行緒才能再次鎖定該資源。互斥鎖保證了每次只有⼀個執行緒進⾏寫⼊操作, 從⽽保證了多執行緒情況下資料的正確性。

**實現:

from threadind import lock      #匯入模組

mutex = lock()                  #建立鎖例項

mutex.acquire()                 #上鎖

mutex.release()                 #解鎖

其中,鎖定⽅法acquire可以有⼀個blocking引數。

如果設定blocking為true,則當前執行緒會堵塞,直到獲取到這個鎖為⽌ (如果沒有指定,那麼預設為true)

如果設定blocking為false,則當前執行緒不會堵塞

當⼀個執行緒調⽤鎖的acquire()⽅法獲得鎖時,鎖就進⼊「locked」狀態。

每次只有⼀個執行緒可以獲得鎖。如果此時另⼀個執行緒試圖獲得這個鎖,該線 程就會變為「blocked」狀態,稱為「阻塞」,直到擁有鎖的執行緒調⽤鎖的 release()⽅法釋放鎖之後,鎖進⼊「unlocked」狀態。

執行緒排程程式從處於同步阻塞狀態的執行緒中選擇⼀個來獲得鎖,並使得該線 程進⼊運⾏(running)狀態。

總結鎖的好處:

確保了某段關鍵**只能由⼀個執行緒從頭到尾完整地執⾏

鎖的壞處:

阻⽌了多執行緒併發執⾏,包含鎖的某段**實際上只能以單執行緒模式執 ⾏,效率就⼤⼤地下降了 由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對⽅持有 的鎖時,可能會造成死鎖

在多執行緒開發中,全域性變數是多個執行緒都共享的資料,⽽區域性變數等是 各⾃執行緒的,是⾮共享的

執行緒 互斥鎖

include include include include include 1.靜態初始化,當動態初始化時,遮蔽靜態初始化 pthread mutex t mutex pthread mutex initializer 2.動態初始化 pthread mutex t mutex int lock...

執行緒互斥鎖

執行緒互斥鎖 降低效率,保證資料安全 執行緒 資料共享 修改共享資料,資料不安全 from threading import thread,lock import time n 100 deftask global n temp n time.sleep 0.1 n temp 1 if name m...

Python執行緒中的互斥鎖

互斥鎖引入背景 coding utf 8 author bolin chen date 2021 02 22 import threading,time num 0 def th1 temp global num for i in range temp num 1 print f in the th...