进程占用资源查看: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