您的位置:首页 >资讯 > 国内 >

Python中threading模块 lock、Rlock的使用

2023-08-14 19:24:37    来源:博客园

一、概述

在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lock 、Rlock 、Semaphore 、Event 、Condition 用来保证线程之间的同步,后者保证访问共享变量的互斥问题。

  • Lock & RLock:互斥锁,用来保证多线程访问共享变量的问题
  • Semaphore对象:Lock互斥锁的加强版,可以被多个线程同时拥有,而Lock只能被某一个线程同时拥有。
  • Event对象:它是线程间通信的方式,相当于信号,一个线程可以给另外一个线程发送信号后让其执行操作。
  • Condition对象:其可以在某些事件触发或者达到特定的条件后才处理数据

1、Lock(互斥锁)

请求锁定 — 进入锁定池等待 — — 获取锁 — 已锁定— — 释放锁

Lock(指令锁)是可用的最低级的同步指令。Lock处于锁定状态时,不被特定的线程拥有。Lock包含两种状态——锁定和非锁定,以及两个基本的方法。可以认为Lock有一个锁定池,当线程请求锁定时,将线程至于池中,直到获得锁定后出池。池中的线程处于状态图中的同步阻塞状态。


(资料图片仅供参考)

构造方法:mylock = Threading.Lock( )

实例方法:

  • acquire([timeout]): 使线程进入同步阻塞状态,尝试获得锁定。
  • release(): 释放锁。使用前线程必须已获得锁定,否则将抛出异常。

实例一(未使用锁):

import threadingimport timenum = 0def show(arg):    global num    time.sleep(1)    num +=1    print("bb :{}".format(num))for i in range(5):    t = threading.Thread(target=show, args=(i,))  # 注意传入参数后一定要有【,】逗号    t.start()print("main thread stop")--------------------------------------------------------------------------main thread stopbb :1bb :2bb :3bb :4bb :5

实例二(使用锁)

import threadingimport timenum = 0lock = threading.RLock()# 调用acquire([timeout])时,线程将一直阻塞,# 直到获得锁定或者直到timeout秒后(timeout参数可选)。# 返回是否获得锁。def Func():    lock.acquire()    global num    num += 1    time.sleep(1)    print(num)    lock.release()for i in range(10):    t = threading.Thread(target=Func)    t.start()------------------------------------------------------------------12345678910#可以看出,全局变量在在每次被调用时都要获得锁,才能操作,因此保证了共享数据的安全性

对于Lock对象而言,如果一个线程连续两次release,使得线程死锁。所以Lock不常用,一般采用Rlock进行线程锁的设定。

import threadingimport timeclass MyThread(threading.Thread):    def run(self):        global num         time.sleep(1)        if lock.acquire(1):              num = num+1            msg = self.name+" set num to "+str(num)            print(msg)            lock.acquire()            lock.release()            lock.release()num = 0lock = threading.Lock()def test():    for i in range(5):        t = MyThread()        t.start()if __name__ == "__main__":    test()------------------------------------------------------Thread-12 set num to 1

2、RLock(可重入锁)

RLock(可重入锁)是一个可以被同一个线程请求多次的同步指令。RLock使用了“拥有的线程”和“递归等级”的概念,处于锁定状态时,RLock被某个线程拥有。拥有RLock的线程可以再次调用acquire(),释放锁时需要调用release()相同次数。可以认为RLock包含一个锁定池和一个初始值为0的计数器,每次成功调用 acquire()/release(),计数器将+1/-1,为0时锁处于未锁定状态。

  • 构造方法:mylock = Threading.RLock()

  • 实例方法:acquire([timeout])/release(): 跟Lock差不多。

实例解决死锁,调用相同次数的acquire和release,保证成对出现

import threadingrLock = threading.RLock()  #RLock对象rLock.acquire()rLock.acquire() #在同一线程内,程序不会堵塞。rLock.release()rLock.release()print(rLock.acquire())

详细实例:

import threadingmylock = threading.RLock()num = 0class WorkThread(threading.Thread):    def __init__(self, name):        threading.Thread.__init__(self)        self.t_name = name    def run(self):        global num        while True:            mylock.acquire()            print("\n%s locked, number: %d" % (self.t_name, num))            if num >= 2:                mylock.release()                print("\n%s released, number: %d" % (self.t_name, num))                break            num += 1            print("\n%s released, number: %d" % (self.t_name, num))            mylock.release()def test(): #Python小白学习交流群:711312441    thread1 = WorkThread("A-Worker")    thread2 = WorkThread("B-Worker")    thread1.start()    thread2.start()if __name__ == "__main__":    test() --------------------------------------------------A-Worker locked, number: 0A-Worker released, number: 1A-Worker locked, number: 1A-Worker released, number: 2A-Worker locked, number: 2A-Worker released, number: 2B-Worker locked, number: 2B-Worker released, number: 2

相关阅读

精彩放送

美团在平湖成立汉骑科技公司,经营范围含AI软件开发

三五互联(300051.SZ):光伏项目预计8月底前首片下线,后续将加大设备调试和产能爬坡力度

注意!北京127条公交线路采取停驶、绕行甩站等措施 具体是什么情况?

热血江湖怀旧版:各种活动玩法集锦

特斯拉Model 3后轮驱动版降价1.4万 送保险补贴

“部队来支援咱们这里了” 通信兵翻山越岭架起“生命线”

特斯拉Model Y降价,长续航版最低不到30万!8月新能源车再现降价潮,已有10余家车企出手

同比增长4%!营收达251亿,AI驱动阿里云重回增长

一图读懂:洪灾之后防大疫,这几类疾病要警惕!

《博德之门3》散塔林怎么进幽暗地域?散塔林进幽暗地域图文流程

浙商证券给予华测检测买入评级 华测检测点评报告:业绩符合预期 检测龙头优势凸显

去有水的地方|老君山亲水地图来啦!畅游清凉山水间!

中国驻纽约总领馆发言人:媚美卖台 注定失败

又一波新能源车降价潮来袭?至少10家汽车品牌官宣降价促销

这些情况,千万别坐电梯!

步生莲六宫无妃百度百科(步生莲六宫无妃)

手机拍照怎么把内存变小 手机图片内存怎么变小

西藏那曲草原上的“速度与激情”

盗墓团伙挖洞抽水致3人中毒身亡,法院判了:6人获刑

营收稳步提升 技术创新提振机械行业发展信心

刚出生的小鸡怎么喂养 怎么喂养刚出生的小鸡

修车没钱去碰瓷,以“身”讹钱?

洗头和洗澡要怎么做才更有效?

雅芳化妆品大全清单(雅芳化妆品好吗)

狗粮哪个牌子的品质好还便宜?

陕西西安起底失实检举控告案件 澄清正名鼓干劲

【丰收进行时】莲子迎丰收 荷塘映笑脸

广东住建厅关于汕头市建安实业(集团)有限公司的行政处罚决定书

金融监管总局:全力以赴做好防汛救灾保险理赔工作

登贝莱背刺哈维,是谁给了他这么大的勇气,辜负球队这五年

阴干的衣服为何有臭味?如何去除?请看这里!

合成导热油多少钱一吨(合成导热油)

建议帮帮碧桂园、龙湖等优质民营房企

黄色预警!武汉这些区域将有雷电大风,局部雨量20—40毫米

热点简讯|传感圈一周大事

甘肃省答谢东西部协作对口帮扶城市济南专场演出活动举行

动漫壁纸

各炒一盘菜 共办一桌席!国内农林大咖齐聚昆明共烹“果蔬盛宴”

清者自清无需解释句子 清者自清

定喘镇动煎(关于定喘镇动煎简述)

交管部门为大堤抢险制定导行方案

“裤子+运动鞋”才是今年秋天最洋气舒适穿搭,适合四五十岁女人

金融监管总局印发通知要求全力做好防汛救灾保险赔付及预赔工作

黑龙江东宁加紧转移安置涉汛地区人员

国足复仇战,10月对阵世预赛苦主,至少增2新国脚 4归化进名单

精灵随想录 并不惊喜的重逢

工行淮安盱眙支行“一以贯之”暖民心 适老服务再升温

前7个月广西外贸进出口增长34.4% 对RCEP其它成员国进出口增速超6成

20 年前的国产“智能手机系统”,究竟有多少个第一

岳父生病需要38万,岳母要我出28万,小舅子出10万

又美又努力!成绩优异获国奖,求职路上不迷茫,她将“专业”变“职业”

大中矿业(001203)6月30日股东户数5.49万户,较上期减少7.75%

大陆美食在台湾引乱战!民众排队苦等,民进党严防死守

假玉器图片(假玉器)

TFBOYS演唱会reaction合集(周年演唱会+个人演唱会)

婚后得到的所有的财产都属于夫妻共同财产吗

嘴强王者 男子提供网上代骂服务 一天100元 获利近万元

经济学人智库EIU|研报下载电子版pdf|洞悉全球经济|The Economist Intelligence Unit

8 万的车,如何卖出雷克萨斯的高贵?

郑州市快手平台网上购物节活动2023年

​江苏如皋:“文农旅”巧融合,催热夏日“甜蜜经济”

广州市青少年乒乓球锦标赛落幕,增城未来或迎更高水平赛事

办 理 假 存 折/存 单价格

最新通报!德州1人被查!

突发山洪,已致2人死亡16人失联

你的内裤该换了!高腰、收腹裤!无痕不夹臀!

2023珠宝零售行业市场发展现状及消费者画像分析

纪录片|风雨落坡岭:K396次列车脱困记

“修路造福系百姓 抗洪抢险显真情”

太原:文源大桥主桥,合龙!

被杭州穿搭圈粉了:满街都在穿“半裙+乐福鞋”,看着高级又时髦

开发者给力:苹果Vision Pro头显可运行Windows XP虚拟机

「环时财经深度」“认房不认贷”如何影响房地产市场?

全城接力寻人 两位英雄找到了

暑期客流持续增长 首都机场旅客吞吐量突破3000万人次

云南“三大经济”促高质量发展

美国消费者通胀预期意外下滑 短期指标重返近16个月低位

多渠道激发农村消费活力

【晚报】比亚迪方程豹将于 16 日举行发布会 / 红米 K60 至尊版官宣

钢铁市场弱势有望扭转 三季度钢厂利润或改善

举报新东方的小丑,为什么让所有人都尴尬

比亚迪豹5将亮相 主打硬派越野车市场

22万件骚扰电话投诉 违规催收最高 平安银行等银行成投诉热点

8月11日基金净值:富国兴远优选12个月持有混合A最新净值0.8684,跌1.69%

足球前瞻:马赛VS兰斯,巴黎VS洛里昂,拜仁VS莱比锡红牛

反恐精英ol(反恐精英游戏币)

【明日方舟/同人】你期盼的机会来了——能天使(25)

8月12日纳指下跌93.14点

2399元,入手iQOONeo8,那绝对是物有所值的

海军某大队引导新干部传承“雷海先锋”精神——波峰浪谷续写先辈荣光

装修灯具名称(怎么把ie浏览器设置为兼容模式)

集邦咨询:今年Micro LED芯片产值将达到2700万美元 同比增长92%

陕西西安秦岭北麓沣峪突发山洪,210国道中断,有人员失联

多家房企7月销售金额同比下滑

恒力石化(600346):8月11日北向资金减持197.39万股

挂号“黄牛”调查:“你挂不上,我有办法”

「奔流·调查」宁夏18岁女孩被网约车司机强暴 嫌疑人被刑拘7日后检察院不予批捕

Redmi K60至尊版有白色款 员工:边框颜色很特别

18岁女生控诉遭网约车司机性侵,警方鉴定结果:检出司机DNA

饿了么为视障用户推出“无障碍免单节”:免单不打烊 关怀不停歇

民兵“老叶”坚守永定河堤

Redmi K60 至尊版已确定的配置汇总

机电产品定义 机电产品

首个国产乌司奴单抗申报上市!华东医药抢占自免领域蓝海市场

七种颜色是哪七种 七种颜色是哪七种图片及名称

强军精武河南兵⑲丨王晓江:做好战斗员、教练员、服务员 让信仰化作打好格斗术的“一招一式”

五矿信托回应产品停止兑付传闻

金禧国际控股(00091):陈均鸿辞任独立非执行董事