什么是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))
多核计算机计算密集型下多进程和多线程的区别

相关文章: