python多執行緒程式設計 使用互斥鎖同步執行緒

2022-09-18 19:33:10 字數 2223 閱讀 4946

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import time, threading

# 假定這是你的銀行存款:

balance = 0

muxlock = threading.lock()

defchange_it

(n):

# 先存後取,結果應該為0:

global balance

balance = balance + n

balance = balance - n

defrun_thread

(n):

# 迴圈次數一旦多起來,最後的數字就變成非0

for i in range(100000):

change_it(n)

t1 = threading.thread(target=run_thread, args=(5,))

t2 = threading.thread(target=run_thread, args=(8,))

t3 = threading.thread(target=run_thread, args=(9,))

t1.start()

t2.start()

t3.start()

t1.join()

t2.join()

t3.join()

print balance

結果 :

[/data/web/test_python]$ python multhread_threading.py

0[/data/web/test_python]$ python multhread_threading.py

61[/data/web/test_python]$ python multhread_threading.py

0[/data/web/test_python]$ python multhread_threading.py

24

互斥鎖同步

上面的例子引出了多執行緒程式設計的最常見問題:資料共享。當多個執行緒都修改某乙個共享資料的時候,需要進行同步控制。

執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態:鎖定/非鎖定。某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為「鎖定」,其他執行緒不能更改;直到該執行緒釋放資源,將資源的狀態變成「非鎖定」,其他的執行緒才能再次鎖定該資源。互斥鎖保證了每次只有乙個執行緒進行寫入操作,從而保證了多執行緒情況下資料的正確性。

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

#建立鎖mutex = threading.lock()

#鎖定mutex.acquire([timeout])

#釋放mutex.release()

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

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

balance = 0

muxlock = threading.lock()

defchange_it

(n):

# 獲取鎖,確保只有乙個執行緒操作這個數

muxlock.acquire()

global balance

balance = balance + n

balance = balance - n

# 釋放鎖,給其他被阻塞的執行緒繼續操作

muxlock.release()

defrun_thread

(n):

for i in range(10000):

change_it(n)

加鎖後的結果,就能確保資料正確:

[/data/web/test_python]$ python multhread_threading.py

0[/data/web/test_python]$ python multhread_threading.py

0[/data/web/test_python]$ python multhread_threading.py

0[/data/web/test_python]$ python multhread_threading.py

0

python多執行緒程式設計 使用互斥鎖同步執行緒

假設乙個例子 有乙個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的 encoding utf 8 import threading import time class mythread threading.thread defrun s...

python 使用多執行緒進行併發程式設計 互斥鎖的使用

import threading import time python的thread模組是比較底層的模組,python的threading模組是對thread做了一些包裝的,可以更加方便的被使用 多執行緒程式的執行順序是不確定的,當執行緒被阻塞 blocked 時,執行緒掛起,阻塞結束後,執行緒進入...

多執行緒程式設計 互斥鎖

多執行緒程式設計 互斥鎖 1 引言 互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 1 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...