标准答案

  1. 线程受 GIL 影响 Python 字节码并行,但 I/O 等待时仍有价值。
  2. 多进程可以利用多核,但对象传递、启动、内存和共享状态成本更高。
  3. asyncio 要求依赖链尽量非阻塞,阻塞库需放入受控 executor。
  4. 选择要结合任务粒度、取消、故障隔离、部署模式和下游容量。

题目解析

线程适合阻塞 I/O 和已有线程安全库,asyncio 适合端到端非阻塞 I/O,多进程绕开 CPython GIL 并提供隔离但有 IPC 和内存成本。

混合模型要明确谁管理 executor、连接池和取消。在线请求、CPU 任务和后台队列应隔离资源,避免一种负载占满全部 worker。

选择不能只看基准吞吐,还要看任务粒度、启动/通信成本、故障恢复、内存和下游容量。

常见误区

  • 误区:CPU 密集任务只增加线程。改正:使用多进程或释放 GIL 的原生实现,并按 CPU 压测。
  • 误区:asyncio 与同步阻塞库混用不隔离。改正:换异步客户端或使用有界 executor。
  • 误区:多进程共享可变状态没有 IPC 协议。改正:使用明确的消息、共享存储或进程内不可变数据。

作者信息