《Python面试每日一题》之GIL

问题描述:

描述Python GIL的概念,以及它对Python多线程的影响?
阐明多线程爬虫程序是否比单线程性能有提升,并解释原因。

答:

GIL(Global Interpreter Lock)全称为全局解释器锁,是一个防止解释器多线程并发执行机器码的一个全局互斥锁。其存在主要是因为在机器码执行过程中,Cpython(使用C语言编写的Python解释器)的内存管理不是线程安全的
所以,当每个线程在执行时都需要先获取GIL,保证同一时刻只有一个线程可以执行机器码。
因此,当使用Cpython解释器解释多线程程序时,为了保证线程安全,即共享资源的原子性。默认使用了一个GIL,导致多线程实际是“伪多线程”。
程序分为计算密集型程序I/O密集型程序
计算密集型程序的特点是没有延时和阻塞,整段机器码几乎都用于计算的功能。
I/O密集型程序的特点是存在延时或堵塞,程序的功能主要是实现收发数据。
Cpython解释计算密集型程序时,多线程和单线程在运行时效上没有明显的区别,不过在解释I/O密集型程序时,多线程还是比单线程更快。因为在多线程中,当程序遇到堵塞或延时时,当前线程会释放GIL,让其他线程获取,因此多线程爬虫程序是比单线程程序在性能上有提升。

Python 3.2开始使用新的GIL释放机制。在新的GIL实现中,用一个固定的超时时间来指示当前的线程放弃全局锁。在当前线程保持这个锁,且其他线程请求这个锁的时候,当前线程就会在5ms后被强制释放掉这个锁。

发布了14 篇原创文章 · 获赞 9 · 访问量 3826

猜你喜欢

转载自blog.csdn.net/qq_43462005/article/details/104217526