Python學習之互斥鎖和死鎖

2022-07-27 05:54:12 字數 2155 閱讀 4633

1.程序之間的資料不能共享,但是共享同一套檔案系統,所以訪問同乙個檔案,或者同乙個列印終端,是沒有問題的,而共享帶來的是競爭競爭帶來是錯亂

2.如何控制,就是加鎖處理,而互斥鎖就是互相排斥,假設把多個程序比喻成多個人,互斥鎖的工作原理是多個人都要去爭搶同乙個資源:比如搶乙個房間,誰先搶到這個資源就暫時先占為己有然後上個鎖,然後在他占用的時間段內別人是要等他用完

hreading模組中定義了lock類,可以方便的處理鎖定:

1.建立鎖

mutex = threading.lock()

2.鎖定

mutex.acquire([timeout])

3.釋放

mutex.release()

其中,鎖定方法acquire可以有乙個超時時間的可選引數timeout。如果設定了timeout,則在超時後通過返回值可以判斷是否得到了鎖,從而可以進行一些其他的處理。

使用互斥鎖實現上面的例子的**如下:

from multiprocessing import process,lock

import time,random

#互斥鎖:必須是lock.acquire()一次,然後lock.release()釋放一次,才能繼續lock.acquire()

#互斥鎖和join區別

#大前提:二者的原理都是一樣的,都是將併發變成序列,從而保證有序

#區別:join是按照認為指定的順序執行,而互斥鎖是所有的程序平等的競爭,誰先搶到誰執行

mutex=lock()

#兩個執行緒都在搶著對這個鎖進行上鎖,如果有一方成功上鎖,那麼導致另外一方會堵塞(一直等待),到這個鎖被解開為之

thnum=0

class mythread(threading.thread):

def run(self):

mutex.acquire()

for i in range(10000):

global thnum

thnum+=1

print(thnum)

mutex.release()

def test():

global thnum

mutex.acquire() #等待可以上鎖,通知而不是輪訓,沒有占用cpu

for i in range(10000):

thnum+=1

print(thnum)

mutex.release()#解鎖

在多道程式系統中,由於多個程序的併發執行,改善了系統資源的利用率並提高了系統的處理能力。然而,多個程序的併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個程序因競爭資源而造成的一種僵局,若無外力作用,這些程序都將無法向前推進。

**示意

from threading import thread,lock

import time

mutexa=lock()

mutexb=lock()

class mythread(thread):

def run(self):

self.func1()

self.func2()

def func1(self):

mutexa.acquire()

print('\033[41m%s 拿到a鎖\033[0m' %self.name)

mutexb.acquire()

print('\033[42m%s 拿到b鎖\033[0m' %self.name)

mutexb.release()

mutexa.release()

def func2(self):

mutexb.acquire()

print('\033[43m%s 拿到b鎖\033[0m' %self.name)

time.sleep(2)

mutexa.acquire()

print('\033[44m%s 拿到a鎖\033[0m' %self.name)

mutexa.release()

mutexb.release()

if __name__ == '__main__':

for i in range(5):

t=mythread()

t.start()

python互斥鎖和死鎖

同步就是協同步調,按預定的先後次序進行執行。如 你說完,我再說。同 字從字面上容易理解為一起動作 其實不是,同 字應是指協同 協助 互相配合。如程序 執行緒同步,可理解為程序或執行緒a和b一塊配合,a執行到一定程度時要依靠b的某個結果,於是停下來,示意b執行 b執行,再將結果給a a再繼續操作。解決...

python 互斥鎖,死鎖

同步與非同步之間的區別 1.同步 可以理解為執行緒a和b一塊配合工作,a執行到一定程度時要依靠b的某個結 果,於是停下來示意b執行,b執行完將結果給a,然後a繼續執行。2.非同步 非同步是指程序不需要一直等待下去,而是繼續執行下面的操作,不管其他程序的狀態,當有資訊返回的時候會通知程序進行處理,這樣...

Python互斥鎖 死鎖

死鎖當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制。執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀...