由于全局解释器锁的存在,python3的多线程是伪并行的。
现在看进程。如果一个CPU仅仅有4个核,我在设置pool的时候,设置Pool(5),此时,有5个并行的进程在同时运行,这个说法不对吧,任何时刻,由于CPU的束缚,仅仅只可以有4个进程并行。
我的理解对吧?
由于全局解释器锁的存在,python3的多线程是伪并行的。
现在看进程。如果一个CPU仅仅有4个核,我在设置pool的时候,设置Pool(5),此时,有5个并行的进程在同时运行,这个说法不对吧,任何时刻,由于CPU的束缚,仅仅只可以有4个进程并行。
我的理解对吧?
说法确实有点儿问题。
严谨来说多进程是“并发”(Cocurrency)的,但未必是“并行”(Parallel)的。
所以你理解的是对的,受物理条件限制,对于 4 核处理器,从微观上看,同一时间确实最多只有 4 个进程(因为还有多线程存在,所以未必每个核上都在跑不同的进程)在运行;但因为有时分复用的存在,宏观上用户感知到的是 N 个进程是在并发执行。
不过还是要结合具体语境具体分析,这两个词很多母语是英语的开发者也一样分不出来。你要是硬咬文嚼字确实能抠出问题来,但犯不着。
Python 里因为 GIL 的存在(强调:这是 CPython 等解析器的锅,不是 Python 本身语言的特性),简单理解就是一把全局“大锁”,所以在多核上一次还是只能跑一个进程。
你的理解是对的。多核可以让python做到并行(Parallel)执行,但是最大并行数量等于机器的物理核数。
当你设置Pool(5)
时,Python会创建5个进程来处理任务。但是在任何时刻,由于CPU只有4个核心,所以最多只能有4个进程真正并行执行。第5个进程只有当其中一个进程结束或阻塞时,才会获取CPU执行。也就是【至多会有和CPU核心数相同数量的进程同时执行,其余进程会在等待调度。】
同时在运行的线程只能是核心数量,但是CPU使用分时方法让用户觉得都是并行的,也就是4核心、5线程的情况下,CPU不会等待4个线程全部执行完毕才执行第五个线程,而是在执行过程中不断的在5个线程中切换执行,你可以想象成每个线程执行几行代码,然后立马切换到其他线程执行,之后再不断切换(切换是完全随机的,不能保证先后顺序),因此从用户角度他们是并行的。