GIL(全局解释锁)面试题
- --------------------------描述一下gill的概念-------------------------------------
答: 保证同一时刻只有一个线程在执行。
ps:多进程的时候变量不共享代码复制一份,线程之间共享全局变量 。如果想发挥多核请用进程,但是之前又说线程比进程占用资源少,因此可以分为以下情况
如果使用c语言编写的python解释器,那么使用多进程
如果使用其他语言编写的python解释器,那么使用多线程
-1. 单线程死循环
while True:
pass
htop
top命令:显示操作系统运行的情况
-2. 两个线程死循环
import threading
def test():
while True:
pass
t1 = threading.Thread(target=test)
t1.start()
while True:
pass
~
~
结果如下
- 3.两个进程死循环
import multiprocessing
def test():
while True:
pass
t1 = multiprocessing.Process(target=test)
t1.start()
while True:
pass
结果如下
以上说明真正可以实现并发进行的还是多进程任务,为什么多线程并发是假的呢?一个在做另一个在休息。因为GIL
- 使用c语言来解决GIL的问题
- 执行代码解释器的问题
- 代码可以再服务器里面写 有这个
- 解释器默认拿c语言写,同时当年设置编写解释器的人的时代还没有多核处理器可以实现并发,所以GIL保证了python解释器中只有一个线程在做
--------------------- 对python多线程的影响------------------------
问:到底什么情况下GIL有缺点呢?
答:具有io操作的程序可以用线程来做
计算密集型程序(程序中间没有延时大量的时间咋计算数据)用进程
io密集型:(频繁输入输出)用线程,协程。补充:协程gevent单线程等待资源的时候利用时间做其他函数的代码
编写一个多线程抓取网络的数据
- 通过多线程会不会比单线程快?如果快的话为什么?
是否是多线程的爬取要比单线程的快?
是的
那怎么办解释GIL?答:GIL在合适的时间里边切换到其他的线程中