#!/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函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...