python系列——多线程中的lock、Rlock的应用与区别,以及Python2与python3对于多线程处理的不同
发布日期:2021-09-30 09:33:37 浏览次数:5 分类:技术文章

本文共 1989 字,大约阅读时间需要 6 分钟。

参考博客:

1、python2与python3在多线程中,在不加锁的情况下对共享数据的修改的问题:

示例代码:

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingimport timenum = 100 #设置一个共享变量def show():    global num  #在函数内操作函数外变量,需设置为全局变量    time.sleep(1)    num -= 1list=[]for i in range(100):    t = threading.Thread(target=show)    t.start()    list.append(t)for t in list:    t.join()print(num)

在python2中,上述代码有时候输出0(正常情况),有时候输出1,2,3,10等等不正确的数。

而在python3中,全部输出正常(输出0)

2、使用lock锁:

#!/usr/bin/env python# -*- coding:utf-8 -*-import threadingimport timenum = 100 #设置一个共享变量lock=threading.Lock()  #生成全局锁def show():    global num  #在函数内操作函数外变量,需设置为全局变量    time.sleep(1)    lock.acquire()  #修改前加锁    num -= 1    lock.release()  #修改后解锁list=[]for i in range(100):    t = threading.Thread(target=show)    t.start()    list.append(t)for t in list:    t.join()print(num)

3、使用递归锁Rlock锁:

#!/usr/bin/env python# -*- coding:utf-8 -*-import threading#递归锁def run1():    lock.acquire()  #小锁    global num    num +=1    lock.release()    return numdef run2():    lock.acquire()  #小锁    global  num2    num2+=1    lock.release()    return num2def run3():    lock.acquire()  #大锁    res = run1()    res2 = run2()    lock.release()    print(res,res2)if __name__ == '__main__':    num,num2 = 0,0    lock = threading.RLock()    #生成Rlock    for i in range(10):        t = threading.Thread(target=run3)        t.start()while threading.active_count() != 1:#如果不等于1,说明子线程还没执行完毕    pass #打印进程数else:    print(num,num2)

4、lock和Rlock的区别:

RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。 如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的琐。

import threadinglock = threading.Lock()    #Lock对象lock.acquire()lock.acquire()  #产生了死琐。lock.release()lock.release() import threadingrLock = threading.RLock()  #RLock对象rLock.acquire()rLock.acquire()    #在同一线程内,程序不会堵塞。rLock.release()rLock.release()

5、何时使用递归锁:

为了支持在同一线程中多次请求同一资源,python提供了"递归锁":threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire。直到一个线程所有的acquire都被release,其他的线程才能获得资源。

转载地址:https://blog.csdn.net/h_jlwg6688/article/details/108334791 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python系列——多线程之Semaphore信号量及
下一篇:python系列——多线程threading模块的直接调用与继承式调用

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 16时44分32秒