真实面经题目 · 原创解析
协程解决什么问题,和线程性能怎么比较?
这题考并发模型和性能边界,回答要说明协程降低的是调度和内存成本,不是让 CPU 计算突破核心数。
真实面经题目 · 原创解析
这题考并发模型和性能边界,回答要说明协程降低的是调度和内存成本,不是让 CPU 计算突破核心数。
协程主要解决高并发 I/O 场景下线程数量过多的问题。传统线程由内核调度,栈空间和上下文切换成本较高;协程通常由语言运行时在用户态调度,栈更小,挂起和恢复更轻,可以用少量线程承载大量等待 I/O 的任务。但协程仍运行在线程之上,CPU 密集任务的并行度受核心数和工作线程数限制;如果调用阻塞系统调用或持锁计算,协程调度也会被破坏。
每个线程都有内核调度状态和较大的栈空间,数量过多会带来内存占用、上下文切换、调度抖动和锁竞争。高并发 I/O 如果一请求一线程,很容易让线程数膨胀。
协程是更轻量的执行单元,通常在用户态由运行时调度。遇到网络 I/O、定时器或异步等待时挂起,线程去运行其他协程,等待就绪后再恢复执行。
协程在 I/O 密集场景收益明显:同样内存可以承载更多并发,切换成本更低,代码还能保持接近同步写法。它减少的是等待带来的线程浪费,而不是减少业务逻辑本身的 CPU 指令。
CPU 密集任务仍需要足够的内核线程和 CPU 核心;单个协程长时间计算会占住工作线程。阻塞调用、长时间持锁、同步文件 I/O 或不支持协程调度的库,都可能拖慢同线程上的其他协程。
面试中要结合语言运行时说明,例如 Go 的 goroutine、Kotlin coroutine、Java virtual thread 或 Python async。重点比较调度层级、栈大小、阻塞处理、调试复杂度和与现有阻塞库的兼容性。
不能。协程需要线程承载执行,真正并行仍依赖多个内核线程和 CPU 核心,只是很多等待型任务不必各占一个线程。
因为大量请求的时间花在等待网络或磁盘,协程挂起后线程可以继续处理其他任务,降低线程数量和切换成本。
如果运行时不能把阻塞调用转移或感知,它会占住承载线程,导致同线程上的其他协程也无法运行。
不是。协程过多也会消耗内存、调度队列和下游资源,仍需要限流、背压、连接池和超时控制。