前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么有人说 Python 多线程是鸡肋?

为什么有人说 Python 多线程是鸡肋?

原创
作者头像
程序员皮克
发布于 2021-12-21 02:19:26
发布于 2021-12-21 02:19:26
1K10
代码可运行
举报
文章被收录于专栏:Python2Python2
运行总次数:0
代码可运行

为什么有人会说 Python 多线程是鸡肋?知乎上有人提出这样一个问题,在我们常识中,多进程、多线程都是通过并发的方式充分利用硬件资源提高程序的运行效率,怎么在 Python 中反而成了鸡肋?

有同学可能知道答案,因为 Python 中臭名昭著的 GIL,GIL 是什么?为什么会有 GIL?多线程真的是鸡肋吗? GIL 可以去掉吗?带着这些问题,我们一起往下看,同时需要你有一点点耐心。

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 "1亿" 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?show me the code

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 任务
def decrement(n):
    while n > 0:
        n -= 1
复制代码

单线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import time

start = time.time()
decrement(100000000)
cost = time.time() - start
>>> 6.541690826416016
复制代码

在我的4核 CPU 计算机中,单线程所花的时间是 6.5 秒。可能有人会问,线程在哪里?其实任何程序运行时,默认都会有一个主线程在执行。(关于线程与进程这里不展开,我会单独开一篇文章)

多线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import threading

start = time.time()

t1 = threading.Thread(target=decrement, args=[50000000])
t2 = threading.Thread(target=decrement, args=[50000000])

t1.start() # 启动线程,执行任务
t2.start() # 同上

t1.join() # 主线程阻塞,直到t1执行完成,主线程继续往后执行
t2.join() # 同上

cost = time.time() - start

>>>6.85541033744812
复制代码

创建两个子线程 t1、t2,每个线程各执行 5 千万次减操作,等两个线程都执行完后,主线程终止程序运行。结果,两个线程以合作的方式执行是 6.8 秒,反而变慢了。按理来说,两个线程同时并行地运行在两个 CPU 之上,时间应该减半才对,现在不减反增。

是什么原因导致多线程不快反慢的呢?

原因就在于 GIL ,在 Cpython 解释器(Python语言的主流解释器)中,有一把全局解释锁(Global Interpreter Lock),在解释器解释执行 Python 代码时,先要得到这把锁,意味着,任何时候只可能有一个线程在执行代码,其它线程要想获得 CPU 执行代码指令,就必须先获得这把锁,如果锁被其它线程占用了,那么该线程就只能等待,直到占有该锁的线程释放锁才有执行代码指令的可能。

因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换、锁机制处理(获取锁,释放锁等),所以,多线程执行不快反慢。

什么时候 GIL 被释放呢?

当一个线程遇到 I/O 任务时,将释放GIL。计算密集型(CPU-bound)线程执行 100 次解释器的计步(ticks)时(计步可粗略看作 Python 虚拟机的指令),也会释放 GIL。可以通过 sys.setcheckinterval()设置计步长度,sys.getcheckinterval() 查看计步长度。相比单线程,这些多是多线程带来的额外开销

CPython 解释器为什么要这样设计?

多线程是为了适应现代计算机硬件高速发展充分利用多核处理器的产物,通过多线程使得 CPU 资源可以被高效利用起来,Python 诞生于1991年,那时候硬件配置远没有今天这样豪华,现在一台普通服务器32核64G内存都不是什么司空见惯的事,但是多线程有个问题,怎么解决共享数据的同步、一致性问题,因为,对于多个线程访问共享数据时,可能有两个线程同时修改一个数据情况,如果没有合适的机制保证数据的一致性,那么程序最终导致异常,所以,Python之父就搞了个全局的线程锁,不管你数据有没有同步问题,反正一刀切,上个全局锁,保证数据安全。这也就是多线程鸡肋的原因,因为它没有细粒度的控制数据的安全,而是用一种简单粗暴的方式来解决。

这种解决办法放在90年代,其实是没什么问题的,毕竟,那时候的硬件配置还很简陋,单核 CPU 还是主流,多线程的应用场景也不多,大部分时候还是以单线程的方式运行,单线程不要涉及线程的上下文切换,效率反而比多线程更高(在多核环境下,不适用此规则)。所以,采用 GIL 的方式来保证数据的一致性和安全,未必不可取,至少在当时是一种成本很低的实现方式。

那么把 GIL 去掉可行吗?

还真有人这么干多,但是结果令人失望,在1999年Greg Stein 和Mark Hammond 两位哥们就创建了一个去掉 GIL 的 Python 分支,在所有可变数据结构上把 GIL 替换为更为细粒度的锁。然而,做过了基准测试之后,去掉GIL的 Python 在单线程条件下执行效率将近慢了2倍。

Python之父表示:基于以上的考虑,去掉GIL没有太大的价值而不必花太多精力。

小结

CPython解释器提供了GIL(全局解释器锁)保证线程数据同步,那么有了 GIL,我们还需要线程同步吗?多线程在IO密集型任务中,表现又怎样呢?欢迎大家留言

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
怎么感觉这里介绍的业务监控更像是应用服务监控呢?比如说的核心指标:请求量、成功率、耗时,这个更像是应用的指标
怎么感觉这里介绍的业务监控更像是应用服务监控呢?比如说的核心指标:请求量、成功率、耗时,这个更像是应用的指标
回复回复点赞举报
推荐阅读
腾讯业务监控的修炼之路「二」
织云平台团队
2017/10/25
3.7K0
腾讯业务监控的修炼之路「二」
嘉为蓝鲸张敏:运维体系为什么要基于平台化建设
涉及关键词:一体化运维、平台化运维、数智化运维、运维PaaS、运维架构治理、蓝鲸等。
嘉为蓝鲸
2024/01/30
1.1K0
嘉为蓝鲸张敏:运维体系为什么要基于平台化建设
少年,你的告警量可以更少些!
作者简介:梁定安,腾讯织云负责人,目前就职于腾讯社交网络运营部,开放运维联盟委员,腾讯云布道师,腾讯课堂运维讲师,EXIN DevOps Master讲师,凤凰项目沙盘教练,复旦大学客座讲师。* 请原
织云平台团队
2017/05/15
4.9K0
少年,你的告警量可以更少些!
嘉为蓝鲸张敏:构建多维一体的运维体系
运维一体化是近几年被广泛提起的概念,有各种解读和实践形态,在到具体的技术架构和管理实践前,我们还是要对一体化有几个基本定义,这样才能更为严肃地探讨运维一体化的本质。
嘉为蓝鲸
2024/01/25
1.8K0
嘉为蓝鲸张敏:构建多维一体的运维体系
运维管理一体化:构建多维一体化的运维体系
涉及关键词:一体化运维、平台化运维、数智化运维、运维PaaS、运维工具系统、蓝鲸等。
腾讯蓝鲸助手
2024/07/03
2K0
BizDevOps全局建设思路:横向串联,纵向深化
IT技术交付实践方法在不断迭代中持续优化。在工业化时代,Biz(业务)、Dev(开发)、Ops(运维)三者往往相对分离,甚至有时只有其中的两者或仅有一者独立存在。然而,随着时代的演进,互联网化时代带来了敏捷的先进思想,推动了业务与技术的初步融合。DevOps等理念则进一步促进了开发与运维的深度融合,打破了组织壁垒,提升了团队协作效率。如今,在数字化时代,我们更加注重以业务为中心,实施精益化、平台化、一体化的管理模式,以更好地满足业务需求。业务与技术之间的链接一步步紧密,这是业务竞争与技术发展之间的双向奔赴。BizDevOps也应运而生。
嘉为蓝鲸
2024/04/19
3360
BizDevOps全局建设思路:横向串联,纵向深化
青铜到王者:AIOps 平台在腾讯的升级之路
在海量运营方法论的指导下,运维团队构建了体系化的运维能力,为众多产品保驾护航。
织云平台团队
2018/03/28
6K1
青铜到王者:AIOps 平台在腾讯的升级之路
LLMOps+DeepSeek:大模型升级一体化运维
蛇年伊始,DeepSeek凭借其卓越表现火爆出圈,让AI大模型瞬间成为街头巷尾热议的焦点,也让大众重新燃起对AGI(通用人工智能)“平民化”的信心,DeepSeek通过先进的模型架构,带来的高效率与低成本优势,加快了应用场景的百花齐放。
嘉为蓝鲸
2025/02/21
8050
LLMOps+DeepSeek:大模型升级一体化运维
风险感知场景(一)之“监控、拨测、巡检、可观测性”
从发现风险角度,我们经常会从监控、拨测、巡检、可观测性、演练、混沌工程等角度发现风险。上周和必示的温博后聊了一下风险感知,今天理理思路,摘“监控、拨测、巡检、可观测性”4点做个简述,再看看风险感知场景的切入点。
彭华盛
2022/11/16
3.7K1
风险感知场景(一)之“监控、拨测、巡检、可观测性”
【深度好文】如何基于谷歌SRE理论,建设企业IT应用系统稳定性能力?
在当今数字化转型步伐不断加快的时代,IT应用系统的稳定运行成为了企业的业务正常运转的重要基础,因此,运维管理体系的构建也从围绕着数据中心转向围绕着应用系统方向,首个专门面向应用运维的理论体系——SRE,由Google发布后,受到了越来越多的企业的青睐,很多国内企业已经纷纷效仿Google建立SRE团队,旨在为各个业务应用系统提供更好的稳定性保障能力,为业务保驾护航。
嘉为蓝鲸
2021/09/06
1.9K0
【深度好文】如何基于谷歌SRE理论,建设企业IT应用系统稳定性能力?
【四川农信】主力军银行里的智慧运维力量-嘉为案例
四川省农村信用社联合社(以下简称“四川农信”)诞生于1951年,紧盯打造“农村金融主力军、地方金融主力军、普惠金融主力军”目标愿景,全面推进合规银行、智慧银行、主力军银行建设。至2021年12月底,四川农信有5131个营业网点,近4万名从业人员,资产规模达1.8万亿元,各项存款1.5万亿元,各项贷款8775亿元,资产规模、存款规模位居全省同业第一位、全国农信系统第七位。
嘉为蓝鲸
2023/01/17
6930
【四川农信】主力军银行里的智慧运维力量-嘉为案例
AI 时代下腾讯的海量业务智能监控实践
作者丨李春晓:腾讯高级工程师,目前为腾讯SNG社交网络运营部社交平台业务运维组员工。 海量业务的挑战 互联网业务讲究“极致、口碑、快”,经历过长时间的演进,腾讯SNG社交平台产品用户访问量已经达到亿级、十亿级, 我们的业务监控、业务分析等数据也显示:业务前、后端成功率都已经达到99%, 99.9%以上。 但随之带来的挑战也是显而易见的,例如: 1.长时间历史的发展,导致后端架构复杂,功能模块众多、监控系统多、告警量大,如何简化,让告警简单、有效? 2.关键业务成功率, 0.01%的指标告警都可能引起成千、上
企鹅号小编
2018/02/07
5.2K0
AI 时代下腾讯的海量业务智能监控实践
CMDB数据治理-从治理策略到工具落地
小魏是某银行配置经理,这天,银行部门年度会议上,运维领导突然说:“CMDB是我们整个自动化运维平台的基础,必须发挥好他主数据的价值,让大家尽可能都感受到他的价值,注意一定不能因为数据质量的问题导致大家不愿意用!”
嘉为蓝鲸
2023/02/22
1.1K0
CMDB数据治理-从治理策略到工具落地
日进斗金的银行业务保障,靠这样的运维服务!
本文介绍了如何通过自动化运维平台实现IaaS层资源的统一管理,并针对金融云场景提供了详细的解决方案。
织云平台团队
2017/09/22
1.7K0
日进斗金的银行业务保障,靠这样的运维服务!
未雨绸缪,业务连续性保障法宝——基于SRE理论的业务体系建设
作为近年热词的SRE自被提出以来,引起了各方的关注和思考。随着技术的迭代,在基础运维、云计算运维的基础上,SRE工程师更多地关注工具化、流程化的建设,更进而地去思考平台化,体系化,全面化的技术栈设计。在业务侧的推动下,企业对敏态效率和稳态安全的全面关注;对保障稳定和质量同时控制成本、提升价值和效率等多方面的需求都对SRE在企业的内部落地提出了更高和更针对性的要求。
嘉为蓝鲸
2021/11/30
1.1K0
未雨绸缪,业务连续性保障法宝——基于SRE理论的业务体系建设
详解华夏银行iDo平台一体化运维的落地过程
随着数字化转型的深入,基于中台和PaaS架构的一体化运维建设也在各行各业快速展开,但是如何将运维平台本身的能力与企业已有的工具能力进行中台化整合、工具场景如何联动,是个复杂而庞大的工程。
嘉为蓝鲸
2022/11/24
2.1K0
详解华夏银行iDo平台一体化运维的落地过程
鹏华基金研运一体化平台落地实践,探索数字化转型
5月16日,蓝鲸行业说直播专栏又迎来新一期的更新,第八期带来金融基金行业的研运一体化落地实践分享。
嘉为蓝鲸
2024/06/11
2370
鹏华基金研运一体化平台落地实践,探索数字化转型
这样的CMDB设计,居然阻止了海量告警对运维的轰炸
梁定安(大梁),运维技术总监,复旦大学客座 DevOps讲师。多年运维、运营开发和 DevOps 的工作经验,曾负责 Qzone、相册等 SNG 社交平台类业务的运维规划与管理,经历了 SNG 运维标准化、自动化、智能化建设的全程。腾讯织云负责人。 1 标题党一回!本文主要介绍运维 CMDB 的设计思路,恰当的 CMDB 设计,对运维效率的提升,如收敛告警和故障自愈等,有着意想不到的效果。 在运维自动化平台的设计理念中,我们一直提倡“减少运维对象”,并将运维对象进行抽象化、模型化、配置化的录入 CMDB 中
织云平台团队
2018/06/19
1.6K0
vivo 服务端监控体系建设实践
经过几年的平台建设,vivo监控平台产品矩阵日趋完善,在vivo终端庞大的用户群体下,承载业务运行的服务数量众多,监控服务体系是业务可用性保障的重要一环,监控产品全场景覆盖生产环境各个环节。从事前发现,事中告警、定位、恢复,事后复盘总结,监控服务平台都提供了丰富的工具包。从以前的水平拆分,按场景建设,到后来的垂直划分,整合统一,降低平台割裂感。同时从可观测性、AIOps、云原生等方向,监控平台也进行了建设实践。未来vivo监控平台将会向着全场景、一站式、全链路、智能化方向不断探索前行。
2020labs小助手
2023/01/03
1.2K0
腾讯海量监控体系经验分享
提及腾讯的海量监控的挑战,将近 20 套监控系统,指标有将近 300 多个,监控的实例超过 900 万。
腾讯大讲堂
2018/01/18
3.4K0
腾讯海量监控体系经验分享
推荐阅读
相关推荐
腾讯业务监控的修炼之路「二」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验