Python中的并发和并行

311 阅读2分钟

并发和并行

  • 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。

并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。

单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。

并发只有结合 I/O 多路复用、异步 I/O 才能实现并发能力。

Python 中并发/并行和多线程/多进程模型的关系

线程和并发/并行

首先了解一下线程的概念:

在操作系统中,线程是 CPU 调度和执行任务的基本单位,是进程中的一条执行流。进程是资源分配的基本单位,每个进程都至少有一个线程,多个线程共享所属进程的内存空间。

我们说并发是指同一时间段内 CPU 交替执行不同任务,其实就是 CPU 不断切换执行线程。线程是最小执行单元。

那么并发 = 单核 CPU 多个线程交替切换执行,并行 = 多核 CPU 多个线程同时执行。

在大多数语言如 Java 中,多个线程是可以在多核 CPU 上执行的,Java 多线程模型 = 并发 + 并行

Python 并发/并行

在 Python 中存在 GIL (全局解释器锁),同一进程同一时刻,只能有一个线程执行。即使没有单核 CPU 的物理限制,但程序被加锁,所以 Python 的多线程模型不能利用多核 CPU。

Python 的多进程模型可以有效利用多核 CPU,因为每一个进程都有独立的 Python 解释器、独立的 GIL。GIL 只保证同一个 Python 解释器进程同一时刻只有一个线程执行,在多进程模型中不受约束。

所以,在 Python 中,多线程模型因为 GIL 限制只能实现并发,可以简单的理解为:

Python 并发 = 多线程模型

Python 并行 = 多进程模型

Python 使用多线程 & 多进程

python多线程&多进程.png

参考资料

多线程必备:并发和并行的区别及优势 - 知乎

极客时间《Python核心技术与实战》 - 21-Python并发编程之Futures