python3爬虫lock如何有序的处理多线程?

python3爬虫lock如何有序的处理多线程?,第1张

python3爬虫lock如何有序的处理多线程

大家肯定在快递很多的时候,在混乱的快递堆里找寻过自己的包裹,其中的困难小编也非常有感悟。同样我们在运行程序时,更倾向于得到排列整齐的结果,这对我们对于数据结果的整理也比较方便。在多线程中就有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


通过上面两个案例的对比,我们可以清楚的看出使用lock函数后,输出的结果是按顺序整齐的排列下来的,比第一个结果看起来不要方便太多了,是不是非常好用呢?更多Python学习指路:PyThon学习网教学中心。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/3014293.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-28
下一篇 2022-09-28

发表评论

登录后才能评论

评论列表(0条)

保存