什么是GIL
GIL是全局解释器锁他规定了每个线程在被CPU执行前都要获得一个GIL,并且同一时刻只有一个线程被执行
为什么要有GIL
因为CPython解释器的内存管理不是线程安全的,所以在CPython中增加的一个GIL锁
线程释放GIL锁的情况
在I/O操作等会引起阻塞状态的操作时,会暂时释放GIL,其他线程可以获取GIL继续执行
python的多线程和多进程的使用场景
1.当CPU处于多任务计算密集型的情况下
单核:两者差不多,但是多线程更加省资源
多核:由于多线程不能利用多核的优势,所以使用多进程更有优势
2.当CPU处于多任务I/O密集型的情况下
单核:和上述一样,多线程更省资源
多核:由于I/O密集型的任务耗费的时间大部分在I/O操作上,并且cpu在阻塞状态时可以暂时释放GIL,所以还是多线程更省资源(开启进程是耗费资源,当需要进行的任务过多,多进程耗费的时间会大大超过多线程)
1 # 计算密集型 2 from multiprocessing import Process 3 import os,time 4 def work(): 5 res=0 6 for i in range(100000000): 7 res*=i 8 9 10 if __name__ == '__main__': 11 l=[] 12 print(os.cpu_count()) # 本机为8核 13 start=time.time() 14 for i in range(6): 15 p=Process(target=work) # 在当前机器上,多进程耗时 9.134473323822021s 16 # p=Thread(target=work) # 在当前机器上,多线程耗时 51.49368095397949s 17 l.append(p) 18 p.start() 19 for p in l: 20 p.join() 21 stop=time.time() 22 print('run time is %s' %(stop-start))