首页 > 编程语言 >Python全局解释器锁GIL机制

Python全局解释器锁GIL机制

时间:2023-11-22 13:55:31浏览次数:36  
标签:解释器 Python 密集型 线程 GIL CPU

全局解释器锁

Global Interpreter Lock,CPython在解释器级别的一把锁,叫GIL全局解释器锁。

程序编译成字节码,程序想跑多线程,但是GIL保证CPython进程中,同一时刻只能有一个线程执行字节码。

所以,哪怕是在多CPU的情况下,即使每个线程恰好调度到了每个CPU上,有了这把大锁,同时只能有一个CPU使用CPython执行一个线程的字节码,其它线程只能阻塞等待

全局解释器锁实现为一种在CPython中提供线程安全内存管理的简单方法,只允许一次执行一个Python线程

IO密集型和CPU密集型任务

IO密集型,由于线程阻塞,就会调度其它线程;(wait会让出时间片,让其它线程有机会被调度、sleep不会),如大量使用网络IO、磁盘IO

CPU密集型,当前线程可能会连续的获得GIL,导致其它线程几乎无法使用CPU。(刚释放锁就又夺走了),大量占用CPU计算时间

对于IO密集型任务,GIL不会产生重大瓶颈,可以通过使用Python的线程模块实现多个并发线程来获得并行加速;

对于CPU密集型任务,受CPU限制并且大部分时间都在执行CPU密集型计算,那么GIL会对多线程性能产生负面影响,但有很多方法可以解决这个问题。

因为Python是一种解释型语言,它本身就很慢,所以处理器繁重的算法通常使用像C ++这样的更快的编译语言编写,然后Python程序可以调用包含他们的函数库中。这些操作可以使用并行线程在GIL的限制之外执行。

如果你想保留用Python编写的所有内容,解决方法是使用Python的多处理包来实现具有多个进程而不是多个线程的程序。每个Python进程都是它自己的Python解释器实例,它有自己的GIL,因此单独的进程可以并行执行。这里的缺点是进程之间的通信比线程之间的通信要复杂一些,创建多个进程比创建多个线程使用更多的系统资源

标签:解释器,Python,密集型,线程,GIL,CPU
From: https://www.cnblogs.com/yogayao/p/17848855.html

相关文章

  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-32-JavaScript的调用执行-下篇
    1.简介 在实际工作中,我们需要对处理的元素进行高亮显示,或者有时候为了看清楚操作过程和步骤我们需要跟踪鼠标点击了哪些元素需要标记出来。虽然很少遇到,但是为了以后大家可以参考或者提供一种思路,今天宏哥就在这里把这种测试场景playwright是如何处理的讲解和分享一下。2.用法......
  • [951] Understanding the pattern of "(.*?)" in Python's re package
    InPython'sregularexpressions, (.*?)isacapturinggroupwithanon-greedyquantifier. Let'sbreakdownthecomponents:(and ):Parenthesesareusedtocreateacapturinggroup.Thisallowsustocaptureaportionofthematchedtext..*?:......
  • [950] Python RegEx (re library)
    ref:PythonRegExARegEx,orRegularExpression,isasequenceofcharactersthatformsasearchpattern.RegExcanbeusedtocheckifastringcontainsthespecifiedsearchpattern.RegExModulePythonhasabuilt-inpackagecalled re,whichcanbeu......
  • 19.python 创建一个本地web服务器
    编写一个server.py文件1importhttp.server2importsocketserver34PORT=800056Handler=http.server.SimpleHTTPRequestHandler78withsocketserver.TCPServer(("",PORT),Handler)ashttpd:9print("Serverstartedatlocalhos......
  • 聪明办法学python
    数据类型:整数(int)         浮点数(float)         布尔值(bool):truefalse         类型(type):print(type(2)) print(type(2.2))  print(type(2<2.2))         isinstance(a,int)常数:truefalsenone......
  • 大数据开发要学什么java还是python?
    在大数据开发领域,Java和Python都是备受青睐的编程语言。它们分别具有各自独特的特点和优势,在大数据处理方面也有不同的应用场景。以下是对Java和Python在大数据开发中的应用、优势以及学习建议的详细描述。Java在大数据开发中的应用和优势1.应用场景Hadoop生态圈:Java广泛......
  • Python在使用pandas时内存使用过大导致服务器宕机,有哪些优化方法?
    当使用pandas处理大规模数据时,内存使用量可能会迅速增加,导致服务器宕机。为了解决这个问题,可以采用以下几个优化方法:数据类型优化:使用更小的数据类型,例如将int64转换为int32或int16,节省内存空间。对于字符串类型,尽量使用'category'类型,它会使用更少的内存。分块处理:使......
  • python+pytest写测试用例后置清理数据操作
    一、teardown_function函数是为了在每个测试函数def执行后进行数据清理。#引入DbConnect类或者确保它已经被定义fromyour_db_moduleimportDbConnectdefteardown_function():try:print("后置操作-做数据清理,把批注通知删掉")db......
  • Java开发者的Python快速进修指南:文件操作
    Python提供的文件操作相对于Java来说,确实简单方便许多。不仅操作简单,代码可读性也相对较高。然而,我们需要注意的不仅仅是文件操作的简单性,还有文件操作的各种模式。在Java中,我们并不经常使用像Python中那样的操作模式。另外,我们还需要注意文件指针的移动。无论是Java还是Python,文......
  • 聪明办法学Python-2023-task01
    task00因为完全按照视频教学傻瓜式操作即可完全学会,这里不做赘述视频链接:【安装】手把手带你配置AI环境_哔哩哔哩_bilibilitask01参考视频链接[Chap1启航]聪明办法学Python第二版_哔哩哔哩_bilibili注释Comment分类:单行注释,使用#开头多行注释,使用'''或"""......