重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章给大家分享的是有关python3爬虫lock怎么有序的处理多线程的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
创新互联建站是一家以网络技术公司,为中小企业提供网站维护、成都网站制作、成都网站建设、网站备案、服务器租用、域名注册、软件开发、重庆小程序开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站咨询电话:18980820575第一个线程处理好了,结果传递给第二个线程,那么需要“锁住“第一个线程。同时需要共享的内存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怎么有序的处理多线程就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!