GIL全局解释器锁及解决办法

进程占用资源查看:htop

双核CPU:同一时刻可以做两件事情 可以同时并行2个进程

 

 

单线程死循环,占满了CPU

 

多线程死循环

运行多线程死循环后的CPU占用率【实际总共只占用了一个CPU的资源,和单线程的占用的资源是一样的】

多进程死循环

运行多进程死循环后CPU的占用率

小结:

以上可以看出 多进程 多线程协程 只有多进程能真正实现并发【占满了两个CPU】

而不管是多线程还是单线程,最后占用的总的CPU资源是一样的

当然了 因为进程才是资源的分配单位

为什么python中多线程和单线程占用的CPU是一样的

因为有一个全局解释器锁:它保证了多线程的程序,一个时刻只有一个线程在工作,而其他线程在休息

 全局解释器锁

小结:

所以如果用的CPython解释器,那么只有通过多进程实现多任务

如果用的JPython解释器,可以使用多线程实现多任务

执行多线程可以发挥多核CPU的能力,让多个CPU同时工作

即使存在全局解释器锁,如果是进行网络爬虫等I/O密集型工作,依然比单线程效率高

 Cpython解释器下:

计算密集型工作使用多进程完成

I/O密集型使用多线程完成

关于C语言

C语言:xxx.c

C语言编译后的代码:xxx.out

C语言是编译型语言:先编译成二进制数据 然后CPU可以直接执行这个二进制程序

python是解释型语言

python语言调用C语言的方式:

.so就是编译过后的文件【动态库,即二进制文件】,在python中去调用这个.so中的函数即可

 

执行调用了C语言后的CPU占用率

总结:全局解释器锁的解决办法

所以 对于GIL的两种解决办法:

1.换python解释器 不使用Cpython

2.把子线程中的代码换成其他语言来实现

 

python可以调很多其他语言:C C++ Java JS等等

C语言只能调用C语言

java可以调用python

原文地址:https://www.cnblogs.com/come202011/p/12978364.html