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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 16时44分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
歪门邪道
2021-06-29
理解String.intern()和String类常量池疑难解析例子
2021-06-29
LeetCode题解(1175):质数排列(Python)
2021-06-29
【Android平台】 Alljoyn学习笔记二 编译自带的demo的步骤
2021-06-29
【Android平台】 Alljoyn学习笔记四 Android Core API参考
2021-06-29
【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析
2021-06-29
【Alljoyn】 Alljoyn学习笔记六 Alljoyn基本概念
2021-06-29
【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
2021-06-29
【Android】Activity生命周期
2021-06-29
【Android】Activity的四种launchMode
2021-06-29
【Android】Activity的task相关
2021-06-29
【Android】 Intent应用详解
2021-06-29
【Android】 Intent详解
2021-06-29
【Android】 常用的Intent
2021-06-29
Android中AsyncTask的简单用法
2021-06-29
【Android】 Android中Log调试详解
2021-06-29
【Android】Android中WIFI开发总结(二)
2021-06-29
【Android】Android之WiFi开发应用示例
2021-06-29
【Android】 Android adb常见问题整理
2021-06-29