您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)python3爬蟲lock怎么有序的處理多線程的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
第一個(gè)線程處理好了,結(jié)果傳遞給第二個(gè)線程,那么需要“鎖住“第一個(gè)線程。同時(shí)需要共享的內(nèi)存shared memory。
如果不加任何lock:
# 不加任何處理,同時(shí)運(yùn)行兩個(gè)線程 import threading def job1(): global A for i in range(10): A += 1 print("Job1 : ", A) def job2(): global A for i in range(10): A += 10 print("Job2 : ", A) A = 0 # global variable t1 = threading.Thread(target=job1) t2 = threading.Thread(target=job2) t1.start() t2.start() t1.join() t2.join()
運(yùn)行結(jié)果
Job1 : 1 Job1 : 2 Job1 : 3 Job2 : 13Job1 : Job2 : 24 Job2 : 34 Job2 : 44 Job2 : 54 Job2 : 64 Job2 : 74 Job2 : 84 Job2 : 94 Job2 : 104 14 Job1 : 105 Job1 : 106 Job1 : 107 Job1 : 108 Job1 : 109 Job1 : 110
這兩個(gè)線程會(huì)同時(shí)運(yùn)行,且打印還比較亂。如果我想先結(jié)束job1,再進(jìn)行job2,那么使用lock——定義一個(gè)全局變量lock,同時(shí)在每個(gè)job中傳入lock。從而兩者運(yùn)行就不會(huì)相互影響。
加上lock
def job1(): global A, lock # 傳入全局變量lock,同時(shí)通過acquire上鎖,通過release解鎖。 lock.acquire() for i in range(10): A += 1 print("Job1 : ", A) lock.release() def job2(): global A, lock lock.acquire() for i in range(10): A += 10 print("Job2 : ", A) lock.release() lock = threading.Lock() A = 0 # global variable t1 = threading.Thread(target=job1) t2 = threading.Thread(target=job2) t1.start() t2.start() t1.join() t2.join()
運(yùn)行結(jié)果
Job1 : 1 Job1 : 2 Job1 : 3 Job1 : 4 Job1 : 5 Job1 : 6 Job1 : 7 Job1 : 8 Job1 : 9 Job1 : 10 Job2 : 20 Job2 : 30 Job2 : 40 Job2 : 50 Job2 : 60 Job2 : 70 Job2 : 80 Job2 : 90 Job2 : 100 Job2 : 110
感謝各位的閱讀!關(guān)于python3爬蟲lock怎么有序的處理多線程就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。