在现代软件开发中,“并发”和“并行”是两个频繁出现但常被混淆的概念。尽管它们都涉及多个任务的处理,但在本质、目标和实现方式上存在显著差异。本文将从定义出发,结合 Python 的具体示例,清晰阐述两者的区别及其适用场景。
一、基本概念
并发(Concurrency)指的是多个任务在一段时间内交替或重叠执行的能力。它关注的是程序的结构设计——如何组织多个逻辑流,使其能够协调运行。并发不要求任务真正同时执行;在单核处理器上,操作系统通过快速切换上下文,使多个任务看起来像是同时进行。
并行(Parallelism)则指多个任务在同一时刻真正同时执行。这通常依赖于多核 CPU 或多个处理器,每个任务在独立的计算单元上运行。并行的核心目标是提升计算性能,缩短任务完成时间。
简言之:
- 并发是“处理多个事情的能力”(dealing with many things at once);
- 并行是“同时做多个事情”(doing many things at once)。
二、Python 中的并发与并行
Python 的标准实现(CPython)包含一个称为GIL(Global Interpreter Lock,全局解释器锁)的机制。GIL 确保同一时刻只有一个线程执行 Python 字节码,这使得多线程在 CPU 密集型任务中无法实现真正的并行。然而,在 I/O 密集型场景中,线程在等待 I/O 时会释放 GIL,从而实现高效的并发。
因此,在 Python 中:
- 多线程(
threading)适用于 I/O 密集型任务,可实现并发但非并行; - 多进程(
multiprocessing)适用于 CPU 密集型任务,可绕过 GIL,实现真正的并行。
下面通过具体代码示例说明。
示例 1:使用 threading 实现并发(I/O 密集型)
importthreadingimporttimedefio_task(name):print(f"线程{name}开始 I/O 操作")time.sleep(2)# 模拟网络请求或文件读写print(f"线程{name}完成")start=time.time()t1=threading.Thread