在多執行緒中,如果多執行緒同時對乙個全域性變數進行操作時,就有可能出現異常,比如下面的程式:
# -*- 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...