Python全局锁GIL,详细解读

什么是GIL

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

进程与线程

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

多线程编程的问题

  • 为了效率,多线程一般会使用异步, 异步的执行流程可能导致结果的不确定
  • Ptyhon中特殊问题,资源管理方式:资源的引用计数,引出了GIL的使用

GIL原理

  • GIL是在底层的一把锁,是bytecode字节码级别的互斥锁, 保证同一时刻只有一个线程来控制Python解释器
  • GIL解决了Python中引用计数加锁的问题
  • GIL使得扩展的C库和Python程序融合是资源管理等容易
    误解1:一个常见误解, 有了GIL, 多线程就不用加锁了

多核问题

在这里插入图片描述
多核的情况下,有了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 多进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值