[python]多线程并发 vs 多进程并行

1,180 阅读2分钟

先说结论

python, 如果是多线程,那么只能实现并发,因为GIL的原因
python, 如果是多进程, 且是多核cpu, 那么可以实现并行

多进程实现并行

计算机程序是存储在磁盘上的文件。
只有把它们加载到内存中,并被操作系统调用,它们才会拥有其自己的生命周期,生命周期才算开始。
进程表示一个正在执行的程序,进程(Process)是计算机中已运行程序的实例。
每个进程都有独立地址空间以及其他的辅助数据。


多进程实现并行的必要条件是什么?
总进程数量不多于CPU核心数量!
如果不满足,那么运行的程序都是轮询调度产生的假象。
也就是说,是否能实现并行,取决于服务器的cpu核心数量。

多线程实现并发

线程被称作轻量级进程。
线程是进程中的一个实体,操作系统不会为进程分配内存空间,它只有一点在运行中必不可少的资源
线程被包含在进程中,是进程中的实际运作单位
同一个进程内的多个线程会共享相同的上下文,
也就是共享资源(内存和数据)。
线程(thread)是操作系统能够进行运算调度的最小单位。

为什么多线程不是并行?

进程具有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响。
线程共享地址空间,一个线程非法操作共享数据崩溃后,整个进程就崩溃了。

不同进程之间是独立的,切换需要耗费较大资源
线程共享进程地址空间,切换开销小

Python在设计的时候,还没有多核处理器的概念。
因此,为了设计方便与线程安全,直接设计了一个锁GIL全局解释器锁(线程锁)。
这个锁要求,任何进程中,一次只能有一个线程在执行。
因此,并不能为多个线程分配多个CPU。
所以Python中的线程只能实现并发,而不能实现真正的并行。

但是Python3中的GIL锁有一个很棒的设计,

在遇到阻塞(不是耗时)的时候,会自动切换线程。

很多库是基于GIL锁写的,取消代价太大
进程可以实现并行和并发
线程只能实现并发
遇到阻塞就自动切换。
我们可以利用这种机制来,充分利用CPU。