python 多进程
1、Ubuntu 下使用 htop 监控内存和cpu 的使用状态。
可以看到多数cpu 处于空闲状态。
2、有一段简单的python代码,在test.py 脚本文件内(死循环)
(这里的pass 相当于占位符,空语句。没有io,尽可能多地使用cpu)
3、启动 多个终端(这里启动了3个终端),每个终端都运行上面的代码 python.py
可以看到,有3个cpu利用率到达了100%。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
将 test.py 的内容修改如下:
运行后的资源占用情况
可以看到虽然起了3个线程,但是并没有某一个CPU被沾满,但是加起来也只是占用了一个cpu 的 资源。也就是说,任何一个时刻最多只有一个线程在使用cpu,尽管其他的cpu 空闲也不能被使用。python 并没有真正的多并行,只有并发。
---------------------------------------------------------------------------------------------------------------------------------------------------------
将多线程改成多进程
启动了4个进程,分别占用了4个CPU核心,真正的多任务。
---------------------------------------------------------------------------------------------------------------------------------------------------------
这是由于GIL (全局解释器锁)的原因,在python 设计之初,计算机还没有多cpu ,并没有考虑并发的问题。GIL 保证每个时刻最多只有一个线程使用cpu。这是用c 语言写的python 解释器的问题,不是python 语言的问题。java 写的python 的解释器也没有这个问题。 现在想移除GIL 并不容易,移除后的效率也不一定会更好。
python test.py -----> (解释器 XXX.py) python 解释器 可以用 C C++ C++ java 编写。 python 是解释型语言,c c++ 是编译型语言。
python 解释器将python 语言翻译成二进制,有编译和执行的作用。
gcc -share test.c 【linux 下 C 语言 编译成动态库】
在一些有IO任务的线程中,使用多线程还是比单线程效率更高 ,在进行IO时进行线程的切换。
计算密集型 (多进程) IO 密集型 (多线程、协程)
解决方法:在子线程中调用其他语言编写的代码。