标准答案
- 线程受 GIL 影响 Python 字节码并行,但 I/O 等待时仍有价值。
- 多进程可以利用多核,但对象传递、启动、内存和共享状态成本更高。
- asyncio 要求依赖链尽量非阻塞,阻塞库需放入受控 executor。
- 选择要结合任务粒度、取消、故障隔离、部署模式和下游容量。
题目解析
线程适合阻塞 I/O 和已有线程安全库,asyncio 适合端到端非阻塞 I/O,多进程绕开 CPython GIL 并提供隔离但有 IPC 和内存成本。
混合模型要明确谁管理 executor、连接池和取消。在线请求、CPU 任务和后台队列应隔离资源,避免一种负载占满全部 worker。
选择不能只看基准吞吐,还要看任务粒度、启动/通信成本、故障恢复、内存和下游容量。
常见误区
- 误区:CPU 密集任务只增加线程。改正:使用多进程或释放 GIL 的原生实现,并按 CPU 压测。
- 误区:asyncio 与同步阻塞库混用不隔离。改正:换异步客户端或使用有界 executor。
- 误区:多进程共享可变状态没有 IPC 协议。改正:使用明确的消息、共享存储或进程内不可变数据。