您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python中最大的一把锁

时间:2022-08-19 13:58:08  来源:麦叔编程  作者:小K

今天可以来讲解下GIL是个什么了。

GIL为什么是Python/ target=_blank class=infotextkey>Python中最大的一把锁?

GIL是Global Interpreter Lock的缩写,翻译过来就是全局解释器锁。

从字面上去理解,它就是锁在解释器头上的一把锁,它使Python代码运行变得有序。

假如有一段代码:

print(1)print(2)print(3)print(4)print(5)print(6)

运行之后,

123456

GIL通过确保在任何给定时间只运行一个线程来防止竞争条件

GIL确保在任何给定时间只有一个线程在运行。
因此,不可能利用具有线程的多个处理器。
由于CPython的内存管理不是线程安全的,GIL可以防止竞争条件并确保线程安全。

突破GIL的封锁

更换解释器

Python有多个解释器实现。分别用C、JAVA、C#和Python编写的CPython、Jython、IronPython和PyPy是最受欢迎的。

GIL 仅存在于CPython的原始Python实现中。

那为什么不直接使用别的解释器为主要开发用呢?
因为CPython的库最为丰富。
如果别的解释器有支持你代码中的模块,那是可以直接移植过去使用的。
像Jython至今还没有推出Python3,只停留在Python2时代。

用多进程替代多线程

我将用三段代码(单线程、多线程、多进程)解决一个问题(把50000000通过n-=1减至0)。

通过对比他们运行的所花费的时间,看哪段代码效率最高。

「单线程」

import timenum = 50000000def countdown(n): while n>0: n -= 1start = time.time()countdown(num)end = time.time()print('花费时间 -', end - start)

运行结果:

花费时间 - 3.7478301525115967

「多线程」

import timefrom threading import Threadnum = 50000000def countdown(n): while n>0: n -= 1t1 = Thread(target=countdown, args=[num//2])t2 = Thread(target=countdown, args=[num//2])start = time.time()t1.start()t2.start()t1.join()t2.join()end = time.time()print('花费时间 -', end - start)

运行结果:

花费时间 - 4.2221999168396

「多进程」

from multiprocessing import Poolimport timenum = 50000000def countdown(n): while n>0: n -= 1if __name__ == '__main__': pool = Pool(processes=2) start = time.time() r1 = pool.Apply_async(countdown, [num//2]) r2 = pool.apply_async(countdown, [num//2]) pool.close() pool.join() end = time.time() print('花费时间 -', end - start)

运行结果:

花费时间 - 2.307600975036621

对于「计算密集型任务」,Python的多线程比单线程还慢,

这是由于线程的创建和销毁都要消耗资源(进程消耗资源更大)。

「对比单线程和多线程就能感受到GIL这个枷锁的束缚力了。」

用了多进程后,运行速度一下子从3.73缩短到2.30秒,证明多进程还是能突破GIL的封锁的。

多进程底层是开了多个解释器去运行代码,一个进程一把GIL。


Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Tags: Python  点击:(5)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Tags: Python  点击:(8)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  Tags: Python  点击:(6)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Tags: Python  点击:(6)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  Tags: Python  点击:(14)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  Tags: Python  点击:(18)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  Tags: Python  点击:(2)  评论:(0)  加入收藏
来源丨网络前言在使用 Python 的早些年,为了解决 Python 包的隔离与管理 virtualenvwrapper 就成为我的工具箱中重要的一员。后来,随着 Python 3 的普及,virtualenvwrapper 逐...【详细内容】
2022-10-24  Tags: Python  点击:(4)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  Tags: Python  点击:(9)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24  Tags: Python  点击:(11)  评论:(0)  加入收藏
▌简易百科推荐
大家好,我是皮皮。一、前言前几天在小小明大佬的Python交流群中遇到一个粉丝问了一个使用Python实现数理统计的实战问题,觉得还挺有用的,这里拿出来跟大家一起分享下。Excel数...【详细内容】
2022-11-03  Python进阶学习交流  今日头条  Tags:Python   点击:(5)  评论:(0)  加入收藏
#安装数据库#根据数据用途选择MySQL\PostgreSQL\SQLite\MariaDB\MongoDB\clickhouse等数据库#本文以MySQL PostgreSQL 为例,其他类似。安装方法自行搜索,不在赘述。# -*- codi...【详细内容】
2022-11-01  Pgabc    Tags:Python   点击:(8)  评论:(0)  加入收藏
为什么叫猴子补丁?猴子补丁的这个叫法起源于Zope框架,大家在修正Zope的Bug的时候经常在程序后面追加更新部分,这些被称作是“杂牌军补丁(guerillapatch)”,后来guerilla就渐渐的...【详细内容】
2022-11-01  VT漫步  今日头条  Tags:Python   点击:(6)  评论:(0)  加入收藏
一、前言前几天在Python钻石交流群【心田有垢生荒草】问了一个Python网络爬虫的问题,下图是截图:代码初步看上去好像没啥问题,但是结果就是不对,地图上显示的结果和网络爬虫抓到...【详细内容】
2022-10-31  Python进阶者    Tags:Python   点击:(6)  评论:(0)  加入收藏
mport sysimport osfrom PyQt5 import QtWidgetsfrom PyQt5.QtGui import QIconimport xlrdimport datetimeimport timefrom openpyxl import Workbookfrom openpyxl.styles...【详细内容】
2022-10-26  张先生870707  今日头条  Tags:Python   点击:(14)  评论:(0)  加入收藏
学习目标 了解分类器的任务和数据样式 掌握如何用Pytorch实现一个分类器分类器任务和数据介绍 构造一个将不同图像进行分类的神经网络分类器, 对输入的图片进行判别并完成分...【详细内容】
2022-10-25  传智教育官方账号  今日头条  Tags:Pytorch实   点击:(11)  评论:(0)  加入收藏
Python作为时下最热门的编程语言之一,有许多库资源。这么多资源,有哪些是程序员必备的Python库呢?老K根据了自己和身边程序员同事及朋友的经验,结合了Github上的star数据,汇总出...【详细内容】
2022-10-25  老K玩代码  今日头条  Tags:Python库   点击:(18)  评论:(0)  加入收藏
参加数学建模比赛,需要明确的一点: 专业知识是一方面,不要单纯地以为把文章写好就能够拿奖; 软件的运用,文章的排版也很重要,排版美观,插图好看,讲事实摆道理通过仿真图,比如函数的拟...【详细内容】
2022-10-24  思铺学院    Tags:数学建模   点击:(2)  评论:(0)  加入收藏
案例需求:定义一个数字(1~10,随机产生),通过3次判断来猜出来数字 案例要求: 1.数字随机产生,范围1-10 2.有3次机会猜测数字,通过3层嵌套判断实现 3.每次猜不中,会提示大了或小了...【详细内容】
2022-10-24  念兮暮霞如烟    Tags:python   点击:(9)  评论:(0)  加入收藏
用python画不断增大的渐变色片状立体图形,源码解释如下:import turtle as t 调用turtle库import colorsys 调用颜色t.bgcolor("black") 设置背景颜色t.tracer(100) 设置追踪频...【详细内容】
2022-10-24   嘻呱嘻呱大又圆     Tags:python   点击:(11)  评论:(0)  加入收藏
站内最新
站内热门
站内头条