广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python GIL(Global In
  • 686
分享到

Python GIL(Global In

PythonGILGlobal 2023-01-31 06:01:42 686人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。 可以肯定的一点是:保护不同的数据的安全,就应该加不同的锁。 要了解

一、GIL介绍
GIL本质就是一把互斥,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。
可以肯定的一点是:保护不同的数据的安全,就应该加不同的锁。
要了解GIL,首先确定一点:每次执行python程序,都会产生一个独立的进程。例如Python test.py,python aaa.py,python bbb.py会产生3个不同的python进程
在一个python的进程内,不仅有test.py的主线程或者由该主线程开启的其他线程,还有解释器开启的垃圾回收等解释器级别的线程,总之,所有线程都运行在这一个进程内。
1、所有数据都是共享的
    其中代码作为一种数据也是被所有线程共享的(test.py的所有代码以及Cpython解释器的所有代码)
2、所有线程的任务,都需要将任务的代码当做参数传给解释器的代码去执行,即所有的线程要想运行自己的任务,首先需要解决的是能够访问到解释器的代码
 综上:
    如果多个线程的target=work,那么执行流程是
    多个线程先访问到解释器的代码,即拿到执行权限,然后将target的代码交给解释器的代码去执行
解释器的代码是所有线程共享的,所以垃圾回收线程也可能访问到解释器的代码而去执行,这就导致了一个问题:
    对于同一个数据100,可能线程1执行x=100的同时,而垃圾回收执行的是回收100的操作,解决这种问题没有什么高明的方法?
    就是加锁处理,如下图的GIL,保证python解释器同一时间只能执行一个任务的代码

二、GIL与Lock
GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理,如下图

Python GIL(Global Interpreter Lock)
Python GIL(Global Interpreter Lock)

三、GIL与多线程
有了GIL的存在,同一时刻同一进程中只有一个线程被执行
进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势,要解决这个问题,我们需要在几个点上达成一致:
    1. cpu到底是用来做计算的,还是用来做I/O的?
    2. 多cpu,意味着可以有多个核并行完成计算,所以多核提升的是计算性能
    3. 每个cpu一旦遇到I/O阻塞,仍然需要等待,所以多核对I/O操作没什么用处 
一个工人相当于cpu,此时计算相当于工人在干活,I/O阻塞相当于为工人干活提供所需原材料的过程,工人干活的过程中如果没有原材料了,则工人干活的过程需要停止,直到等待原材料的到来。
如果你的工厂干的大多数任务都要有准备原材料的过程(I/O密集型),那么你有再多的工人,意义也不大,还不如一个人,在等材料的过程中让工人去干别的活,
反过来讲,如果你的工厂原材料都齐全,那当然是工人越多,效率越高
结论:
    对计算来说,cpu越多越好,但是对于I/O来说,再多的cpu也没用
    当然对运行一个程序来说,随着cpu的增多执行效率肯定会有所提高(不管提高幅度多大,总会有所提高),这是因为一个程序基本上不会是纯计算或者纯I/O,所以我们只能相对的去看一个程序到底是计算密集型还是I/O密集型,从而进一步分析python的多线程到底有无用武之地。
假设一种情况:
    现在有四个任务需要处理,处理方式是要有并发的效果,解决方案可以是:
    方案一:开启四个进程
    方案二:一个进程下,开启四个线程
    单核情况下,分析结果: 
        如果四个任务是计算密集型,没有多核来并行计算,方案一徒增了创建进程的开销,方案二胜
        如果四个任务是I/O密集型,方案一创建进程的开销大,且进程的切换速度远不如线程,方案二胜
    多核情况下,分析结果:
        如果四个任务是计算密集型,多核意味着并行计算,在python中一个进程中同一时刻只有一个线程执行用不上多核,方案一胜
        如果四个任务是I/O密集型,再多的核也解决不了I/O问题,方案二胜
结论:
    现在的计算机基本上都是多核,python对于计算密集型的任务开多线程的效率并不能带来多大性能上的提升,甚至不如串行(没有大量切换)
    但是,对于io密集型的任务效率还是有显著提升的。

四、多线程性能测试
1、计算密集型:多进程效率高
    from multiprocessing import Process
    from threading import Thread
    import os,time
    def work():
            res=0
            for i in range(100000000):
                    res*=i
    l=[]
    print(os.cpu_count()) #本机为4核
    start=time.time()
    for i in range(4):
            # p=Process(target=work) #耗时18s多
            p=Thread(target=work) #耗时26s多
            l.append(p)
            p.start()
    for p in l:
            p.join()
    stop=time.time()
    print('run time is %s' %(stop-start))
2、i/o密集型:多线程效率高
    from multiprocessing import Process
    from threading import Thread
    import threading
    import os,time
    def work():
            time.sleep(2)
            print('===>')
    l=[]
    print(os.cpu_count()) #本机为4核
    start=time.time()
    for i in range(400):
            p=Process(target=work) #耗时4s多,大部分时间耗费在创建进程上
            # p=Thread(target=work) #耗时2s多
            l.append(p)
            p.start()
    for p in l:
            p.join()
    stop=time.time()
    print('run time is %s' %(stop-start))
应用:
多线程用于IO密集型,如Socket爬虫WEB
多进程用于计算密集型,如金融分析

--结束END--

本文标题: Python GIL(Global In

本文链接: https://www.lsjlt.com/news/190347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python GIL(Global In
    一、GIL介绍 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。 可以肯定的一点是:保护不同的数据的安全,就应该加不同的锁。 要了解...
    99+
    2023-01-31
    Python GIL Global
  • [python] GIL
    http://www.dabeaz.com/python/UnderstandingGIL.pdf翻译水平不咋地,建议大家看原版英文,翻译只给自己参考,方便下次观看 A.python线程是真实的系统线程如1.POSIX threads (...
    99+
    2023-01-31
    python GIL
  • python——GIL锁详解
    文章目录 一、GIL全局解释器锁二、为什么会有GIL锁?三、多线程无法利用多核优势?计算密集型和IO密集型计算密集型——采用多进程计算密集型——采用多线程IO密集型——采用多进程IO密集型...
    99+
    2023-09-01
    python 开发语言
  • python GIL怎么用
    这篇文章主要介绍了python GIL怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • python中的global和nonl
    声明: 这篇文章很大程度上借鉴了Global, Local and nonlocal Variables。 local变量 与其它的编程语言相同,在函数中声明的变量都是local变量。作用域仅限于函数中,从函数外是访问不到的。 In [...
    99+
    2023-01-31
    python global nonl
  • ORA-39910: Partitioned Global index string.string in tablespace string points to partition string of
    文档解释 ORA-39910: Partitioned Global index string.string in tablespace string points to partition string of table string.s...
    99+
    2023-11-05
    报错 故障 Global
  • Python中什么是GIL
    本篇文章给大家分享的是有关Python中什么是GIL,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问:说说Python中的GIL是什么?答:在Python中GIL是Global...
    99+
    2023-06-19
  • python中global怎么使用
    在Python中,`global`关键字用来声明一个变量为全局变量。当在函数内部定义了一个变量,而且想要在这个函数外部使用这个变量时...
    99+
    2023-09-20
    python
  • 什么是Python全局锁(GIL),如何避开GIL限制?
    一、什么是Python 全局锁 1、什么是全局锁 简单来说,Python 全局解释器锁(Global Interpreter Lock, 简称 GIL) 是一个互斥锁(或锁),只允许一个线程保持 Py...
    99+
    2023-09-01
    python 开发语言 算法
  • Python会不会删除GIL
    本篇内容介绍了“Python会不会删除GIL ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们知道,在 CPython 中,有一个全局解释...
    99+
    2023-06-15
  • Python中的GIL是什么
    为什么需要 GILGIL 本质上是一把锁,学过操作系统的同学都知道锁的引入是为了避免并发访问造成数据的不一致。CPython 中有很多定义在函数外面的全局变量,比如内存管理中的 usable_arenas 和 usedpools,如果多个线...
    99+
    2023-05-14
    Python gil
  • Python中怎么切换GIL
    这篇文章给大家分享的是有关Python中怎么切换GIL的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是...
    99+
    2023-06-14
  • python多线程与GIL(转)
    作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/python/gil-in-python/GIL是什么GIL(Global Interpreter Lock)并不是python的特性,而是...
    99+
    2023-01-30
    多线程 python GIL
  • python中的global有什么用
    在Python中,`global`关键字用于声明一个全局变量。在函数内部使用`global`关键字声明的变量可以在整个程序中被访问和...
    99+
    2023-09-20
    python
  • Python关键字之global与nonlocal
    目录Python关键字 global与nonlocalglobalnonloacl总结Python关键字 global与nonlocal global def test(): #...
    99+
    2022-11-13
  • Python 局部变量global详解
    目录一、作用域二、局部作用域三、全局作用域四、nonlocal作用域1、使用nonlocal2、就近原则3、函数执行顺序4、循环、判断代码块中作用域问题一、作用域 Local:局部作...
    99+
    2022-11-11
  • Python 有可能删除 GIL 吗?
    目录GIL 的起源尝试消除 GIL积重难返为什么 Python3 一开始时不去除 GIL最后的话我们知道,在 CPython 中,有一个全局解释器锁,英文叫 global inter...
    99+
    2022-11-11
  • 一文弄懂 Gunicorn 与 Python GIL
    什么是 Python GIL,它是如何工作的,以及它如何影响 gunicorn。生产环境我应该选择哪种 Gunicorn worker类型?Python 有一个全局锁 (GIL),它只允许一个线程运行(即解释字节码)。在我看来,如果你想优化...
    99+
    2023-05-14
    Python gunicorn
  • python中gil是什么意思
    这篇文章主要介绍了python中gil是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • python中GIL的原理分析
    小编给大家分享一下python中GIL的原理分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python是什么意思Python是一种跨平台的、具有解释性、编译性...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作