Python全局锁GIL,详细解读

简介: Python全局锁GIL,详细解读

什么是GIL


Python是一门解释型的编程语言, GIL是一把全局的大锁


GIL是一把在底层工作的锁,所有的Python解释器的线程模型都逃不过。GIL在Cpython中对多所有的线程编程进行线程安全管理。


进程与线程


进程与线程:进程相当于一个容器,是操作系统分配资源的单位;线程包含在进程,是操作系统分配时间片的单位

20200719103028453.png

多线程编程的问题


  • 为了效率,多线程一般会使用异步, 异步的执行流程可能导致结果的不确定

  • Ptyhon中特殊问题,资源管理方式:资源的引用计数,引出了GIL的使用

GIL原理


GIL是在底层的一把锁,是bytecode字节码级别的互斥锁, 保证同一时刻只有一个线程来控制Python解释器


GIL解决了Python中引用计数加锁的问题


GIL使得扩展的C库和Python程序融合是资源管理等容易


误解1:一个常见误解, 有了GIL, 多线程就不用加锁了


多核问题

20200719142627742.png

多核的情况下,有了GIL的存在,使得多核不同进程也无法同时进行,使得底层GIL限制了无法实现真正的多核多线程

import time
import threading as th
def isPrime(n):
    for i in range(2, int(n**(0.5) + 1)): #[2, sqrt(n)]
        if n % i == 0:
            return False
    return True
def prime(Nth):
    n_found = 0
    result = 0
    while  n_found <  Nth:
        result += 1
        n_found += isPrime(result)
    return result
if __name__ == "__main__":
    start = 100000
    t1 = time.time()
    print(prime(start), prime(start+1), prime(start +2), prime(start+3))
    print(f"Serial task took: {time.time()-t1} seconds")
    print("=" * 40)
    #single process multi-threads
    t2 = time.time()
    jobs= [th.Thread(target=prime, args=(start,)),
    th.Thread(target=prime, args=(start+1,)),
    th.Thread(target=prime, args=(start+2,)),
    th.Thread(target=prime, args=(start+3,))]
    for j in jobs:
        j.start()
    for j in jobs:
        j.join()
    print(f"Mutil-task took: {time.time()-t2} seconds")
    """
    在进程池中
    计算低1000, 1001, 1002,1003
    """
    t4 = time.time()
    pool = multiprocessing.Pool(processes=4)
    result = pool.map(prime, range(start, start+4))
    print(result)
    print(f"Pool test took: {time.time() -t4} seconds")

执行快慢顺序 : fast -> slow


1.PPool 进程池


2.MP 多进程


3.单进程单线程


4.单进程多线程


结果解释


多核状态 进程池和多进程能够最大化执行效率,充分使用资源


单进程单线程是中规中矩,按部就班按照顺序进行执行


单进程多线程时间慢是因为 在多线程进行切换的时候,处理器在保存上下文和各种资源调度处理时消耗大于单线执行


多核环境,GIL成为了一种阻碍, 无法充分使用多核并行计算特性


CPU bound 和I/O bound


CPU bound是CPU 密集型的处理, 计算密集型, 如:密码破解,数据分析,大数据


I/O bound是I/O密集型的处理,I/O密集型适合Python多线程, 如:下载文件,网络爬虫,数据库操作


在IO密集的情况下,多线程有明显的优势


只有当IO bound 程序的性能提升之后,去除GIL才会有效率的提升


Python多线程–在同一个解释器,在某一个时刻只能有一个线程进行


在Python中可以使用多进程以同生cpu多核执行利用率。


CPU从单核到多核,操作系统从并发到并行


单核是并发,不是真正物理意义上的同时执行;


多核是并行,是真正物理意义上的同时执行


Python的技术演变:多线程mutithreading-mutiprocessing 多进程

相关文章
|
6月前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
69 0
|
4月前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
2月前
|
Java C语言 Python
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
60 0
|
3月前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
37 0
|
4月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
4月前
|
消息中间件 存储 安全
python多进程并发编程之互斥锁与进程间的通信
python多进程并发编程之互斥锁与进程间的通信
|
4月前
|
安全 Python
Python 中的全局解释器锁(GIL)详解
【8月更文挑战第24天】
105 0
|
4月前
|
Python
python 协程 自定义互斥锁
【8月更文挑战第6天】这段代码展示了如何在Python的异步编程中自定义一个互斥锁(`CustomMutex`类)。该类通过`asyncio.Lock`实现,并提供`acquire`和`release`方法来控制锁的获取与释放。示例还包含了使用此自定义锁的场景:两个任务(`task1`和`task2`)尝试按序获取锁执行操作,直观地演示了互斥锁的作用。这有助于理解Python协程中互斥锁的自定义实现及其基本用法。
|
5月前
|
安全 API Python
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。
|
16天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
下一篇
DataWorks