python關於多執行緒使用全域性變數的問題

2021-10-12 08:31:09 字數 2041 閱讀 9713

在多執行緒中,如果多執行緒同時對乙個全域性變數進行操作時,就有可能出現異常,比如下面的程式:

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

import threading

import time

#定義乙個全域性變數

g_num =

0def

test1

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

(g_num)

deftest2

(num)

:global g_num

for i in

range

(num)

: g_num +=

1print

(g_num)

defmain()

: t1 = threading.thread(target=test1,args=

(10000000,)

) t2 = threading.thread(target=test2,args=

(10000000,)

) t1.start(

) t2.start(

) time.sleep(5)

print

('結束:'

,g_num)

if __name__ ==

'__main__'

: main(

)

執行後得到的結果本應是20000000,可是結果真是這樣嗎?執行後得到的結果是:

這是因為乙個程式在未執行完全時就被停止而執行另乙個程式了,從而導致這樣的結果。

那麼怎麼解決這個問題呢?這裡就用到了多執行緒的互斥鎖。具體參見下面的程式:

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

import threading

import time

#定義乙個全域性變數

g_num =

0def

test1

(num)

:global g_num

#上鎖mutex.acquire(

)for i in

range

(num)

: g_num +=

1#解鎖

mutex.release(

)print

(g_num)

deftest2

(num)

:global g_num

# 上鎖

mutex.acquire(

)for i in

range

(num)

: g_num +=

1 mutex.release(

)print

(g_num)

defmain()

: t1 = threading.thread(target=test1,args=

(10000000,)

) t2 = threading.thread(target=test2,args=

(10000000,)

) t1.start(

) t2.start(

) time.sleep(3)

print

('結束:'

,g_num)

if __name__ ==

'__main__'

: mutex = threading.lock(

) main(

)

此時我們就可以得到我們想要的答案了:

python使用多執行緒

做測試的時候,我們不得不接觸下多執行緒,雖然python不能發揮cpu多核的優勢,但是在測試的時候依然十分必要,比如在做介面測試的時候,發出請求之後,在等待伺服器端給予回應的時候,我們不應該傻傻地等,其它執行緒可以在等待的同時發出請求。這樣,我們就能更快地完成我們的測試任務。coding utf 8...

python 多執行緒使用

一 python中的執行緒使用 python中使用執行緒有兩種方式 函式或者用類來包裝執行緒物件。1 函式式 呼叫thread模組中的start new thread 函式來產生新執行緒。如下例 python view plain copy import time import thread def...

python多執行緒使用

一 簡介 由於python2逐漸不被維護,以及python更優越的效能。後面介紹的python相關知識都是用python3版本寫。這裡介紹python3的多執行緒相關知識,執行緒的建立使用threading包。二 簡單執行緒建立 簡介執行緒的建立,先定義執行任務的函式,然後呼叫threading.t...