问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python多线程编程之线程安全问题

发布网友 发布时间:2024-09-29 11:24

我来回答

1个回答

热心网友 时间:2024-09-29 14:10

在多线程环境下,访问相同的资源,有可能会引发线程不安全的问题。这一篇着重讨论这些问题的根源和解决方法。 线程安全是多线程或多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程可以正常并且正确的执行,不会出现数据污染等意外情况。

1.临界资源问题

多个线程同时运行,有时线程之间需要共享数据,一个线程需要其他线程的数据,否则就无法保证程序运行结果的正确性

例如12306网站,每天的火车票数量是有限的,很多售票网点同时销售这些车票。简单模拟这个系统

importthreadingimporttimeimportrandomclassTicketDB:def__init__(self):"""车票数量"""self.ticket_count=5defget_ticket_count(self):"""获取当前车票的数量:return:当前车票的数量"""returnself.ticket_countdefsell_ticket(self):#TODD:用户购票付款流程sleep_time=random.randrange(1,8)time.sleep(sleep_time)t=threading.current_thread()print(f'{t.name}网点,已经售出第{self.ticket_count}张票')self.ticket_count-=1db=TicketDB()defthread_body():globaldbwhileTrue:curr_ticket_count=db.get_ticket_count()ifcurr_ticket_count>0:db.sell_ticket()else:breakdefmain():t1=threading.Thread(target=thread_body)t1.start()t2=threading.Thread(target=thread_body)t2.start()if__name__=='__main__':main()

result:

Thread-2网点,已经售出第5张票Thread-1网点,已经售出第4张票Thread-2网点,已经售出第3张票Thread-1网点,已经售出第2张票Thread-2网点,已经售出第1张票Thread-1网点,已经售出第0张票

每次运行结果都不太一样,但是都会存在一些问题:总共只有5张票,但是却卖了6次。其根本原因是多个线程间数据共享导致了数据的不一致性,这就是临街资源问题。

多个线程间共享的数据称为共享资源或者临界资源,由于CPU负责线程的调度,程序无法精确控制多线程的交替顺序。这种情形下,多线程对临街资源的访问有时会导致数据的不一致性。想要解决这个问题就必须通过锁来保障线程切换的时机。需要注意的是,list、tuple、dict本身就是属于线程安全的,如果多线程对这三种容器多操作,就不会有上述问题。

2 多线程同步

为了防止多线程对临界资源的访问导致的数据不一致性,python提供了“互斥”机制。简单来说,就是为资源对象加上一把“互斥锁”,在任一时刻只能由一个线程访问,即使该线程出现阻塞,该对象的被锁定状态也不会解除,其他线程仍然不能访问该对象,这就是多线程同步。线程同步是保证线程安全的重要手段,但是线程同步客观上会导致性能下降。

python中线程同步可以使用threading模块的Lock类。Lock对象有锁定和未锁定这两种状态,默认是未锁定状态。Lock对象有两个方法实现锁定和解锁。其中,acquire()方法实现锁定,使得Lock对象进入锁定状态;release()方法实现解锁,使得Lock对象进入未锁定状态。

threading模块中提供了最常见的5种锁,具体划分如下:

同步锁:lock(一次只能放行一个)

递归锁:rlock(一次只能放行一个)

条件锁: condition(一次可以放行任意多个)

事件锁:event(一次全部放行)

信号量锁:semaphore(一次可以放行特定个)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 生物冷链具备什么资质 tms是什么意思啊 国产3ce和韩国3ce有什么区别 ...骆驼祥子》《钢铁是怎样炼成的》的读书笔记,急用!!! 三十而立;四十不惑;五十知天命十耄耋;一百期颐的意思? 对痛风最有诊断价值的X线征象是A.双侧性小关节破坏B.关节局部软组织肿胀... www.434343. com有价值吗? 欧元区的国家有没有自己独立的货币,比如说意大利的里拉.应该有吧... 山东哪里有单招培训的学校啊 WPS文本怎么变成蓝色了,怎么解决? 如何设置Excel表格不满一页不自动换页呢? 核桃树苗种植几年会结果?核桃树苗种植方法 计算机控制技术与建筑设计技术哪个更适合女生读,哪个就业好? 计算机控制技术就业前景如何?能找什么样的工作?急啊,拜托了 计算机控制技术专业课程及就业方向 计算机控制技术专业的就业前景怎么样?工作好找吗?工资待遇怎样_百度... 我每天跳1000下绳,多少天可以减去30?还有小腿会变粗吗?那该如何?_百 ... 游戏王决斗链接辉神鸟贝努卡组推荐 仪式卡组辉神鸟贝努卡组攻略-新手... 游戏王决斗链接机甲要塞卡组怎么搭配 机甲要塞卡组搭配攻略 游戏王大师决斗最新版本2023:2023最新版本更新内容 ...而且大便上面有很多的水分,大便是糖稀便,黏在马桶上面用水 ...协议上两个孩子归男方所有,女方不用支付抚养费,现在女方想要回一个... 关于两会的几个问题~ 猫咪眯眼是什么意思? 电脑配置说得过去,怎么玩游戏老是时不时的卡下? 配置:cpu i7 6700k 古文中为的用法,何时用wei第二声何时用wei第四声 明天就要了..._百... 新买了一台电脑,配置没问题为什么玩起游戏帧数很低?具体配置和游戏在这... 股权激励与持股平台的关系 i76700k这款cpu到底咋样玩游戏有人说玩cf都会卡顿 为什么我的电脑装上i76700k玩英雄联盟会卡win7系统没装显卡 老爸吃伊能启元胶囊一个月了,血糖是比较平稳的,只要不暴饮暴食就... 伊能启元胶囊预防高血糖效果好嘛? 没有连续服用伊能启元会影响以后服用的效果? 电扇什么品牌质量好 总结篇--SUMIF函数实用终极帖 发达国家与发展中国家如何定义? 岳阳火车站主要列车时刻表 电脑总是出现联机检查解决方案并 为社么说函数具有单调性是存在反函数的充分不必要条件? 函数问题,1.一个函数存在反函数,那么这个函数一定是单调函数吗_百度知 ... ...所以反函数存在。这是反函数存在的充分不必要条件,谁可以给我举个...