一、什麼是互斥鎖
在多任務模式下,線程(任務)同時訪問同一個變量或資源時,可能會產生競爭,導致數據混亂或錯誤。此時,需要對資源加鎖,保證同一時刻只有一個線程在訪問該資源。互斥鎖(Mutex)就是一種保證同步的機制。
互斥鎖的原理很簡單:當某個線程獲取到互斥鎖時,其他線程就無法再獲取到該鎖,只有等待該鎖釋放後才能繼續訪問。
二、Python中常用的互斥鎖
Python中有多種鎖可供選擇,常用的是threading模塊中提供的Lock類和RLock類。
1. Lock類
Lock類是最簡單的一種互斥鎖,它擁有兩個基本方法:acquire()和release(),分別是獲取鎖和釋放鎖的方法。當多個線程競爭一個 Lock 對象時,只能有一個線程會成功獲取該鎖。
import threading
lock = threading.Lock() # 創建一個 Lock 對象
def func():
lock.acquire() # 獲取鎖
# 訪問共享資源
lock.release() # 釋放鎖
2. RLock類
RLock類是可重入鎖,允許單個線程多次獲得同一把鎖,方便了鎖的嵌套調用。 acquire() 和 release() 的使用方式同 Lock 類。
import threading
lock = threading.RLock() # 創建一個 RLock 對象
def func():
with lock:
# 訪問共享資源,可以加鎖嵌套
三、互斥鎖的應用實例
下面以多線程下載圖片為例,演示互斥鎖的實際應用。
前提條件:已安裝requests模塊,有多張圖片存儲在urls.txt文件中。
import threading
import requests
lock = threading.Lock()
def download(url):
with lock:
filename = url.split('/')[-1]
r = requests.get(url)
with open(filename, 'wb') as f:
f.write(r.content)
print(filename + ' downloaded...')
def main():
urls = []
with open('urls.txt', 'r') as f:
urls = f.read().splitlines()
threads = []
for url in urls:
t = threading.Thread(target=download, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
print('All images downloaded successfully!')
if __name__ == '__main__':
main()
四、總結
互斥鎖可以有效避免多線程訪問資源時的競爭問題,保證了線程間的同步性。在Python中實現互斥鎖主要是通過threading模塊提供的 Lock 類和 RLock 類實現。
在實際應用中,我們可以將互斥鎖用於多線程下載、多線程爬蟲等需要訪問同一資源的場合,確保多個線程之間的數據不發生衝突。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/247927.html