多執行緒加鎖計數方法

2021-10-05 09:28:45 字數 1645 閱讀 5595

import threading

import time

number =

0def

plus()

:global number # global宣告此處的number是外面的全域性變數number

for _ in

range

(1000000):

# 進行乙個大數級別的迴圈加一運算

number +=

1print

("子執行緒%s運算結束後,number = %s"

%(threading.current_thread(

).getname(

), number)

)for i in

range(2

):# 用2個子執行緒,就可以觀察到髒資料

t = threading.thread(target=plus)

t.start(

)time.sleep(2)

# 等待2秒,確保2個子執行緒都已經結束運算。

print

("主線程執行完畢後,number = "

, number)

結果每次不一樣。

子執行緒thread-

2運算結束後,number =

1144974

子執行緒thread-

1運算結束後,number =

1181608

主線程執行完畢後,number =

1181608

原文中做法很多,我用了互斥鎖的方法,很好用。

import threading

import time

number =

0lock = threading.lock(

)def

plus

(lk)

:global number # global宣告此處的number是外面的全域性變數number

lk.acquire(

)# 開始加鎖

for _ in

range

(1000000):

# 進行乙個大數級別的迴圈加一運算

number +=

1print

("子執行緒%s運算結束後,number = %s"

%(threading.current_thread(

).getname(

), number)

) lk.release(

)# 釋放鎖,讓別的執行緒也可以訪問number

if __name__ ==

'__main__'

:for i in

range(2

):# 用2個子執行緒,就可以觀察到髒資料

t = threading.thread(target=plus, args=

(lock,))

# 需要把鎖當做引數傳遞給plus函式

t.start(

) time.sleep(2)

# 等待2秒,確保2個子執行緒都已經結束運算。

print

("主線程執行完畢後,number = "

, number)

問題解決。

Python多執行緒程式設計之多執行緒加鎖

python語言本身是支援多執行緒的,不像php語言。下面的例子是多個執行緒做同一批任務,任務總是有task num個,每次執行緒做乙個任務 print 做完後繼續取任務,直到所有任務完成為止。1 coding utf 8 2import threading 34 start task 0 5 ta...

python 多執行緒 thread 加鎖(二)

thread.start new thread function,args kwargs 函式原型,其中function引數是你將要呼叫的執行緒函式名稱沒有括號 args是講傳遞給你的執行緒函式的引數,他必須是個tuple型別 而kwargs是可選的引數,如果沒有引數,也一定是 import thr...

多執行緒程式何時需要加鎖

簡單的說三條 多人讀,不需要 一讀一寫要加 多人寫要加 常見錯誤 1讀1寫沒事,讀寫的記憶體約多,越容易出事,因為不是原子操作 對int int64 char型是原子操作,可不加鎖,其實沒人保證這一點的,要不c 1x還出個原子模板類幹什麼 常用例項 vector的操作是安全的,如乙個執行緒裡 buf...