python 多进程

1、Ubuntu 下使用 htop 监控内存和cpu 的使用状态。

python GIL 多线程 多进程

可以看到多数cpu 处于空闲状态。

2、有一段简单的python代码,在test.py 脚本文件内(死循环)

python GIL 多线程 多进程

(这里的pass 相当于占位符,空语句。没有io,尽可能多地使用cpu)

3、启动 多个终端(这里启动了3个终端),每个终端都运行上面的代码 python.py

python GIL 多线程 多进程

可以看到,有3个cpu利用率到达了100%。

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------

将 test.py 的内容修改如下:

python GIL 多线程 多进程

运行后的资源占用情况

python GIL 多线程 多进程

可以看到虽然起了3个线程,但是并没有某一个CPU被沾满,但是加起来也只是占用了一个cpu 的 资源。也就是说,任何一个时刻最多只有一个线程在使用cpu,尽管其他的cpu 空闲也不能被使用。python 并没有真正的多并行,只有并发。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------

将多线程改成多进程

python GIL 多线程 多进程

python GIL 多线程 多进程

启动了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 密集型 (多线程、协程)

 

解决方法:在子线程中调用其他语言编写的代码。

 

 

 

相关文章: