python多執行緒程式設計與學習(鎖Lock)

2021-08-15 12:28:45 字數 2084 閱讀 5347

你需要對多執行緒程式中的臨界區加鎖以避免競爭條件。例如只有一台印表機,但卻有兩個以上的輸入程式,這個時候印表機就是競爭資源。

如何解決,給印表機上鎖,使用印表機時上鎖,使用完解鎖。

在python中使用 threading 庫中的 lock 物件

用with語句,更加方便,自動獲取鎖,自動釋放,這樣可以避免忘記釋放

下面看例子:

import threading

import time

import random

class

printtest:

def__init__

(self):

self.lock_value=threading.lock()

defprint_001

(self):

while

true:

time.sleep(random.randint(1,4))

with self.lock_value:

print("001號正在使用印表機")

defprint_002

(self):

while

true:

time.sleep(random.randint(1, 4))

with self.lock_value:

print("002號正在使用印表機")

if __name__=='__main__':

p=printtest()

t1=threading.thread(target=p.print_001)

t2=threading.thread(target=p.print_002)

t1.setdaemon(true)

t2.setdaemon(true)

t1.start()

t2.start()

t1.join()

t2.join()

print("done")

執行結果:

001號正在使用印表機

002號正在使用印表機

002號正在使用印表機

002號正在使用印表機

001號正在使用印表機

002號正在使用印表機

001號正在使用印表機

002號正在使用印表機

002號正在使用印表機

002號正在使用印表機

001號正在使用印表機

順便介紹一下可重入鎖:

在 threading 庫中還提供了其他的同步原語,比如 rlock 和 semaphore 物件。但是根據以往經驗,這些原語是用於一些特殊的情況,如果你只是需要簡單地對可變物件進行鎖定,那就不應該使用它們。乙個 rlock (可重入鎖)可以被同乙個執行緒多次獲取,主要用來實現基於監測物件模式的鎖定和同步。在使用這種鎖的情況下,當鎖被持有時,只有乙個執行緒可以使用完整的函式或者類中的方法。比如,你可以實現乙個這樣的 sharedcounter 類:

import threading

class

sharedcounter:

''' a counter object that can be shared by multiple threads.

'''_lock = threading.rlock()

def__init__

(self, initial_value = 0):

self._value = initial_value

defincr

(self,delta=1):

''' increment the counter with locking

'''with sharedcounter._lock:

self._value += delta

defdecr

(self,delta=1):

''' decrement the counter with locking

'''with sharedcounter._lock:

self.incr(-delta)

Python學習筆記 多執行緒鎖

多執行緒的鎖 如果有多個執行緒同時操作乙個物件,如果沒有很好地保護該物件,會造成程式結果的不可預期 多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。因此需要用鎖threading.l...

python 多執行緒 鎖

參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...

python多執行緒鎖 python的多執行緒程式設計之鎖

1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...