GIL面试题如下
描述Python GIL概念,以及它对Python多线程的影响?在一个多线程抓取网页的程序中,多线程抓取是否比单线程性能有所提升?解释原因。
参考答案
- Python语言和GIL没有半毛钱关系,仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。
- GIL:全局解释器锁,每个线程在执行的过程中需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
- 线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后必须从新获取GIL 。Python3.x使用计时器(执行时间达到阈值,当前线程释放GIL)或Python2.x tickets计数达到100。
- Python使用多进程是可以利用多核的CPU资源。
- 多线程爬取比单线程性能有所提升,因为遇到IO阻塞会自动释放GIL锁。
- 当遇到GIL问题,有两种解决方法。一种是替换掉CPython解释器,另一种是用别的代码来实现。
Python代码调用C代码实现多线程
因为Python是胶水语言,可以调用C,C++, Java等语言
# loop.c
void DeadLoop()
{
while(1){;}
}
# gcc loop.c -shared -o libdead_loop.so
# main.py
from ctypes import *
from threading import Thread
# 加载动态库
lib = cdll.LoadLibrary("./libdead_loop.so")
# 创建一个子线程,让其执行C语言编写的函数,此函数是一个死循环
t = Thread(targer=lib.DeadLoop)
t.start()
# 主线程
while True:
pass
网友评论