标准答案

  1. 进程适合需要故障隔离、独立资源和多核并行的服务,但进程间通信和内存成本更高。
  2. 线程适合共享内存和并行执行,代价是锁竞争、数据竞争和线程栈资源;是否真正并行还取决于运行时和 CPU。
  3. 协程适合大量 I/O 等待,前提是代码和下游调用能够让出执行权;阻塞调用放进协程仍会阻塞承载它的线程。
  4. 事件循环通常用少量线程管理非阻塞 I/O,适合连接多、单次计算短的服务,不适合直接执行长时间 CPU 计算。

题目解析

并发模型要同时回答三个问题:工作是在等待 I/O 还是消耗 CPU,执行单元如何被调度,以及一个故障会影响多大范围。进程、线程、协程和事件循环的差异,本质上是这些边界的不同组合。

协程和事件循环可以降低大量等待连接的管理成本,但不会让阻塞库自动变成非阻塞,也不能替代 CPU 任务的隔离。选择模型时必须把运行时行为和实际依赖一起看。

面试中更可靠的判断方式是从负载和故障场景出发:连接数很多且单次计算短时可以考虑事件循环,CPU 密集或需要故障隔离时要考虑线程或进程,跨实例任务还要补上队列和幂等。

常见误区

  • 误区:认为协程天然并行。改正:协程通常依赖调度器交替执行,真正并行仍需要多个线程或进程以及运行时支持。
  • 误区:把事件循环理解成不能处理并发。改正:事件循环可以用少量线程管理大量非阻塞 I/O,但不能在循环线程里执行长时间阻塞任务。
  • 误区:只看模型名称,不检查下游库。改正:文件、数据库和 HTTP 客户端是否阻塞,往往决定该模型在真实服务中的尾延迟。

作者信息