多執行緒共享全域性變數以及鎖機制

2021-10-01 05:39:19 字數 1371 閱讀 7170

眾多周知,使用多執行緒爬蟲以後我們的爬取速度就會大大增加,如上篇文章中演示的原本需要6秒的執行速度,在增加兩個執行緒以後只需要3秒就可以執行完成。但是,多執行緒並非是沒有問題的,下面我們來看看這個例子:

import threading

value =

0def

add_value()

:global value

for x in

range

(1000000):

value +=

1print

('value: %d'

% value)

defmain()

:for x in

range(2

):t = threading.thread(target=add_value)

t.start(

)if __name__ ==

'__main__'

: main(

)

結果:

value: 1183626

value: 1267435

為什麼會出現這種情況呢???

那是因為當我們的資料足夠大,執行次數足夠多的時候,執行緒就會把別的執行緒還沒有完成的資料就拿來自己用,所有就會出現結果不對的情況。那應該怎麼解決這個問題額,那就需要用到乙個叫「鎖」的東西,話不多說,立馬演示一遍大家就清楚了

import threading

value =

0glock = threading.lock(

)def

add_value()

:global value

glock.acquire(

)for x in

range

(1000000):

value +=

1 glock.release(

)print

('value: %d'

% value)

defmain()

:for x in

range(2

):t = threading.thread(target=add_value)

t.start(

)if __name__ ==

'__main__'

: main(

)

value: 1000000

value: 2000000

這樣子,結果就對了,但是需要注意的是上面上了鎖以後,下面一定要記得釋放,不然程式就一直只會進行當前的執行緒,直到你釋放以後才會繼續向下執行。

多執行緒共享全域性變數以及鎖機制

多執行緒都是在同乙個程序中執行的。因此在程序中的全域性變數所有執行緒都是共享的,這就造成乙個問題,因為執行緒執行的順序是無序的,有可能會造成資料錯誤,為了解決這個問題,threading提供了乙個lock類,這個類可以在某個執行緒訪問某個變數時加鎖,其他執行緒此時不能進來,直到當前執行緒處理完後,把...

多執行緒共享變數 多執行緒共享全域性變數

1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...

7 多執行緒 全域性變數 共享全域性變數

多執行緒 全域性變數 共享全域性變數 多執行緒可以對全域性變數進行修改,修改後的結果會影響下乙個執行緒 程序不可以共享全域性變數,子程序是複製父程序的全域性變數,修改後互不影響 from threading import thread import time,random g num 100 def...