这篇文章给大家分享的是有关python3爬虫lock怎么有序的处理多线程的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
第一个线程处理好了,结果传递给第二个线程,那么需要“锁住“第一个线程。同时需要共享的内存shared memory。
如果不加任何lock:
# 不加任何处理,同时运行两个线程
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()运行结果
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
这两个线程会同时运行,且打印还比较乱。如果我想先结束job1,再进行job2,那么使用lock——定义一个全局变量lock,同时在每个job中传入lock。从而两者运行就不会相互影响。
加上lock
def job1():
global A, lock
# 传入全局变量lock,同时通过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()运行结果
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
感谢各位的阅读!关于python3爬虫lock怎么有序的处理多线程就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!