1. 多进程(Multiprocessing)
定义
• 进程(Process):操作系统分配资源(CPU、内存、文件等)的基本单位,每个进程有独立的内存空间。
• 多进程:多个进程同时运行,每个进程独立执行任务,通过进程间通信(IPC)交换数据。
特点
• 隔离性:进程间内存独立,崩溃不会影响其他进程(稳定性高)。
• 资源开销大:创建和切换进程需要较高的 CPU 和内存成本。
• 并行性:可充分利用多核 CPU(适合计算密集型任务)。
应用场景
• CPU 密集型任务(如科学计算、图像处理)。
• 需要高稳定性的任务(如服务器多进程处理请求)。
示例(Python)
from multiprocessing import Process
def task():
print("Process running")
if __name__ == "__main__":
p = Process(target=task)
p.start()
p.join()
2. 多线程(Multithreading)
定义
• 线程(Thread):进程内的执行单元,共享进程的内存和资源。
• 多线程:单个进程内创建多个线程,通过时间片轮转或抢占式调度实现并发。
特点
• 共享内存:线程间可直接读写同一进程的数据(需注意线程安全)。
• 轻量级:创建和切换线程的开销低于进程。
• 并发性:适合 I/O 密集型任务(如网络请求、文件读写)。
缺点
• 全局解释器锁(GIL):在 Python 等语言中,GIL 导致多线程无法真正并行(同一时刻仅一个线程执行)。
• 调试困难:线程安全问题(如死锁、竞态条件)。
应用场景
• I/O 密集型任务(如 Web 服务器处理请求)。
• 需要快速响应的 GUI 应用。
示例(Python)
import threading
def task():
print("Thread running")
t = threading.Thread(target=task)
t.start()
t.join()
3. 协程(Coroutine)
定义
• 协程:用户态的轻量级线程,由程序(而非操作系统)控制调度,在单线程内实现并发。
• 核心机制:通过 yield 或 async/await 主动让出 CPU,实现非阻塞式任务切换。
特点
• 极低开销:协程切换不涉及内核态操作,资源消耗远低于线程。
• 高并发:单线程可支持数十万协程(适合高并发网络服务)。
• 协作式调度:需手动或自动让出执行权(如遇到 I/O 阻塞)。
应用场景
• 高并发 I/O 操作(如微服务、爬虫、实时通信)。
• 异步编程模型(如 Node.js、Python asyncio)。
示例(Python asyncio)
import asyncio
async def task():
print("Coroutine started")
await asyncio.sleep(1)
print("Coroutine ended")
async def main():
await asyncio.gather(task(), task(), task())
asyncio.run(main())
三者的对比
| 特性 | 多进程 | 多线程 | 协程 |
|---|---|---|---|
| 资源开销 | 高(独立内存) | 中(共享内存) | 极低(无内核切换) |
| 并行性 | 支持多核并行 | 受限于 GIL(如 Python) | 单线程内并发 |
| 适用任务 | CPU 密集型 | I/O 密集型 | 超高并发 I/O 密集型 |
| 开发复杂度 | 中(需处理 IPC) | 高(线程安全) | 中(异步编程思维) |
| 典型应用 | 科学计算、分布式计算 | Web 服务器、GUI 应用 | 微服务、实时通信 |
如何选择?
- CPU 密集型任务 → 多进程(充分利用多核)。
- I/O 密集型任务 → 多线程(简单)或协程(高并发)。
- 超大规模并发 → 协程(如万级网络连接)。
通过理解这些概念,您可以根据实际需求灵活选择并发模型!
164

被折叠的 条评论
为什么被折叠?



