60 秒回答模板

协程主要解决高并发 I/O 场景下线程数量过多的问题。传统线程由内核调度,栈空间和上下文切换成本较高;协程通常由语言运行时在用户态调度,栈更小,挂起和恢复更轻,可以用少量线程承载大量等待 I/O 的任务。但协程仍运行在线程之上,CPU 密集任务的并行度受核心数和工作线程数限制;如果调用阻塞系统调用或持锁计算,协程调度也会被破坏。

考点 核心机制与工程取舍
难度 中高频面试题
回答目标 按定义、机制、场景讲清楚

深入解析

01

线程成本

每个线程都有内核调度状态和较大的栈空间,数量过多会带来内存占用、上下文切换、调度抖动和锁竞争。高并发 I/O 如果一请求一线程,很容易让线程数膨胀。

02

协程机制

协程是更轻量的执行单元,通常在用户态由运行时调度。遇到网络 I/O、定时器或异步等待时挂起,线程去运行其他协程,等待就绪后再恢复执行。

03

性能收益

协程在 I/O 密集场景收益明显:同样内存可以承载更多并发,切换成本更低,代码还能保持接近同步写法。它减少的是等待带来的线程浪费,而不是减少业务逻辑本身的 CPU 指令。

04

性能边界

CPU 密集任务仍需要足够的内核线程和 CPU 核心;单个协程长时间计算会占住工作线程。阻塞调用、长时间持锁、同步文件 I/O 或不支持协程调度的库,都可能拖慢同线程上的其他协程。

05

工程取舍

面试中要结合语言运行时说明,例如 Go 的 goroutine、Kotlin coroutine、Java virtual thread 或 Python async。重点比较调度层级、栈大小、阻塞处理、调试复杂度和与现有阻塞库的兼容性。

易错点

  • 把协程说成不需要线程或能无限并发。
  • 认为协程能提升 CPU 密集计算的单核执行速度。
  • 只比较切换成本,不讲阻塞库、锁和下游资源瓶颈。
  • 忽略调试、栈追踪、取消传播和超时控制等工程复杂度。

面试官追问

协程能替代线程吗?

不能。协程需要线程承载执行,真正并行仍依赖多个内核线程和 CPU 核心,只是很多等待型任务不必各占一个线程。

协程为什么适合高并发 I/O?

因为大量请求的时间花在等待网络或磁盘,协程挂起后线程可以继续处理其他任务,降低线程数量和切换成本。

阻塞调用会带来什么问题?

如果运行时不能把阻塞调用转移或感知,它会占住承载线程,导致同线程上的其他协程也无法运行。

协程是不是越多越好?

不是。协程过多也会消耗内存、调度队列和下游资源,仍需要限流、背压、连接池和超时控制。