京公网安备 11010802034615号
经营许可证编号:京B2-20210330
作者:小K
来源:麦叔编程
❝
上期的Python三分钟留言区,有很多小伙伴想了解Python的GIL是个啥玩意。
但是想了解GIL到底是个啥,我们需要学习一些前置的知识。
这样才能更好得了解GIL。
❞
线程安全, 是指变量或方法(这些变量或方法是多线程共享的) 可以在多线程的环境下被安全有效的访问。
太抽象了?我举个例子:
假如今天中午12:00,在某平台有1元抢茅台活动,参加活动的茅台就一瓶。
但是中午集结了好几万用户在线等开抢信号,时间到了12:00:00,这些用户疯狂点击屏幕抢购。
此时某平台肯定要保证只有一个人能获得活动茅台,要不然平台还不赔死。「这就是线程安全的概念。」
import threadingzero = 0def change_zero(): global zero for i in range(3000000): zero += 1 zero -= 1th1 = threading.Thread(target = change_zero)th2 = threading.Thread(target = change_zero)th1.start()th2.start()th1.join()th2.join()print(zero)
我定义了一个函数change_zero对全局变量zero+1、-1操作。
还定义了两个线程th1和th2去执行它3000000*2次。
每次+1、-1都会被执行的话,输出的zero肯定还是0,
但是代码执行之后...
好像根本不会还等于0。
所以我们推测,运行当中肯定有几次+1,-1的操作没有有效地被执行。(线程非安全)。
但是这样的代码投入生产肯定是有bug的,如果将这代码用在一些金额结算上,那写代码的人肯定是头铁了。
❝
那有什么办法能拯救线程非安全的操作呢?
❞
有个很常用的方法,那就是「加锁」。
import threadinglock = threading.Lock() # 创建线程锁zero = 0def change_zero(): global zero for i in range(3000000): with lock: # 把线程非安全操作加锁 zero += 1 zero -= 1th1 = threading.Thread(target = change_zero)th2 = threading.Thread(target = change_zero)th1.start()th2.start()th1.join()th2.join()print(zero)
从上方代码中,我们把zero += 1和zero -= 1这两步操作进行加锁。
❝
类似于接力跑,只有从前一棒队友手中接过接力棒,才能往下一棒队友那边跑,没有完成接力棒交接则不能跑。
❞
❝
上下文管理器with lock在操作进行时会执行lock.acquire()拿到锁,执行完毕后会将锁释放给下一个操作lock.release()。
❞
运行上方加了锁之后的代码:
得到的结果都是0,没再出现计算混乱的情况,这就从线程非安全转变成线程安全操作了。
看到这,你是否有疑问了?
Python不是有GIL护体吗?怎么还会出现这种线程非安全的情况?
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据分析、业务决策、科学研究等领域,统计模型是连接原始数据与业务价值的核心工具——它通过对数据的规律提炼、变量关联分析 ...
2026-02-14在SQL查询实操中,SELECT * 与 SELECT 字段1, 字段2,...(指定个别字段)是最常用的两种查询方式。很多开发者在日常开发中,为了 ...
2026-02-14对CDA(Certified Data Analyst)数据分析师而言,数据分析的核心不是孤立解读单个指标数值,而是构建一套科学、完整、贴合业务 ...
2026-02-14在Power BI实操中,函数是实现数据清洗、建模计算、可视化呈现的核心工具——无论是简单的数据筛选、异常值处理,还是复杂的度量 ...
2026-02-13在互联网运营、产品迭代、用户增长等工作中,“留存率”是衡量产品核心价值、用户粘性的核心指标——而次日留存率,作为留存率体 ...
2026-02-13对CDA(Certified Data Analyst)数据分析师而言,指标是贯穿工作全流程的核心载体,更是连接原始数据与业务洞察的关键桥梁。CDA ...
2026-02-13在机器学习建模实操中,“特征选择”是提升模型性能、简化模型复杂度、解读数据逻辑的核心步骤——而随机森林(Random Forest) ...
2026-02-12在MySQL数据查询实操中,按日期分组统计是高频需求——比如统计每日用户登录量、每日订单量、每日销售额,需要按日期分组展示, ...
2026-02-12对CDA(Certified Data Analyst)数据分析师而言,描述性统计是贯穿实操全流程的核心基础,更是从“原始数据”到“初步洞察”的 ...
2026-02-12备考CDA的小伙伴,专属宠粉福利来啦! 不用拼运气抽奖,不用复杂操作,只要转发CDA真题海报到朋友圈集赞,就能免费抱走实用好礼 ...
2026-02-11在数据科学、机器学习实操中,Anaconda是必备工具——它集成了Python解释器、conda包管理器,能快速搭建独立的虚拟环境,便捷安 ...
2026-02-11在Tableau数据可视化实操中,多表连接是高频操作——无论是将“产品表”与“销量表”连接分析产品销量,还是将“用户表”与“消 ...
2026-02-11在CDA(Certified Data Analyst)数据分析师的实操体系中,统计基本概念是不可或缺的核心根基,更是连接原始数据与业务洞察的关 ...
2026-02-11在数字经济飞速发展的今天,数据已成为核心生产要素,渗透到企业运营、民生服务、科技研发等各个领域。从个人手机里的浏览记录、 ...
2026-02-10在数据分析、实验研究中,我们经常会遇到小样本配对数据的差异检验场景——比如同一组受试者用药前后的指标对比、配对分组的两组 ...
2026-02-10在结构化数据分析领域,透视分析(Pivot Analysis)是CDA(Certified Data Analyst)数据分析师最常用、最高效的核心实操方法之 ...
2026-02-10在SQL数据库实操中,字段类型的合理设置是保证数据运算、统计准确性的基础。日常开发或数据分析时,我们常会遇到这样的问题:数 ...
2026-02-09在日常办公数据分析中,Excel数据透视表是最常用的高效工具之一——它能快速对海量数据进行分类汇总、分组统计,将杂乱无章的数 ...
2026-02-09表结构数据作为结构化数据的核心载体,其“获取-加工-使用”全流程,是CDA(Certified Data Analyst)数据分析师开展专业工作的 ...
2026-02-09在互联网产品运营、用户增长的实战场景中,很多从业者都会陷入一个误区:盲目投入资源做推广、拉新,却忽视了“拉新后的用户激活 ...
2026-02-06