GIL锁对象(全局解释器)[面试题]
描述Python 中GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐述多线程抓取程序是否比单线程单线程性能有提升,并解释原因。
#1.多线程
#子线程死循环
import threading
def test():
while True:
pass
t1 = threading.Thread(target=test)
t1.start()
#2.主线程
while True:
pass
#3.多进程
import multiprocessing
def deadLoop():
while True:
pass
#子进程死循环
p1 = multiprocessing.Process(target=deadLoop)
p1.start()
由上述代码可知:多线程的并发其实并不是实现了真正意义上的并发。
GIL锁对象是指全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。而 cpython解释器中存在一个GIL(全局解释器锁),他的作用就是保证同一时刻只有一个线程可以执行代码。
结论:
1. 在 处理像科学计算 这类需要持续使用cpu的任务的时候 单线程会比多线程快
2. 在 处理像IO操作等可能引起阻塞的这类任务的时候 多线程会比单线程
如何实现多线程的并发,即如何解决GIL(全局解释器)?
1、更换解释器 比如使用jpython(java实现的python解释器);
2、使用多进程完成多任务的处理。