大家都知道python中由于GIL这把大锁的存在,导致python的多线程并不是真正的多线程(不同于java等语言)。首先了解下GIL导致的现象:同一时间只能有一个线程占有python解释器(或者,同一时刻只有一个线程对共享资源进行存取);而多进程不受GIL的影响是因为:每个 fork 的进程有一个单独的 GIL。关于GIL的详细内容请自行延申推荐参考。

接下来用一个如下的函数(纯计算,不涉及I/O)放到死循环里对多线程和多进程能使用多少从cpu做测试
python随笔系列--多进程多线程并发度初探
测试机cpu正常情况如下
python随笔系列--多进程多线程并发度初探_第1张图片

先看不用进程/线程模式:

python随笔系列--多进程多线程并发度初探
cpu使用情况如下
python随笔系列--多进程多线程并发度初探_第2张图片

多线程模式:

python随笔系列--多进程多线程并发度初探_第3张图片
cpu使用情况如下
python随笔系列--多进程多线程并发度初探_第4张图片

多进程模式:

python随笔系列--多进程多线程并发度初探_第5张图片
cpu使用情况如下
python随笔系列--多进程多线程并发度初探
可以看到python中CPU密集的任务,应该优先使用多进程模型;不过对于I/O密集型任务,多线程每个线程遇到I/O操作时,会让出python解释器,从而实现I/O等待这个环节的并发,亦可以实现 出比穿行快得多的程序,而且比多进程更轻量。