已有进程和线程为什么还需要使用协程?

1 个回答

  • 鬼魅森林
    为了击碎你伪装的表面,我只能用尽全身力气挥出那惊鸿的半月弧光。
    ## 作用 已有进程和线程,仍然需要协程,主要是为了以更低成本支撑高并发,尤其是大量网络 I/O 等待场景: - **进程适合隔离和利用多核**:多进程可利用多 CPU 核心,并提供较好的故障隔离,但进程资源开销较大。 - **线程适合承载执行流**:但“一个线程管一个连接”会浪费资源;线程栈通常是 MB 级,大量线程会带来明显内存和调度成本。 - **协程适合海量 I/O 并发**:协程是用户态的轻量级执行单元,栈通常只有 KB 级,由应用程序调度,不需要每次切换都进入内核。 - **降低异步编程复杂度**:仅使用 I/O 多路复用时,业务往往要拆成事件回调;协程可以让代码按同步顺序书写,底层仍然异步执行。 工业界常见组合是: - **多进程**:负责隔离和利用多核 CPU; - **少量线程**:挂载事件循环; - **大量协程**:在线程内处理海量 I/O 请求。 ## 原理 协程通常与操作系统的 I/O 多路复用配合工作: 1. 协程发起网络读写。 2. 如果数据尚未准备好,就把当前连接注册到 `epoll`、`kqueue`、IOCP 等事件机制中。 3. 协程主动 `yield`,让出执行权,等待后续恢复。 4. 内核线程阻塞在 `epoll_wait` 等事件等待接口上,不空转消耗 CPU。 5. 连接就绪后,内核通知线程。 6. 协程调度器在用户态切回对应协程,通过 `resume` 从原来的位置继续执行。 因此,多路复用负责“监听哪些连接就绪”,协程负责“按顺序执行具体业务”。两者结合后,既能避免大量线程的内核切换和内存开销,又能避免纯回调式异步代码难以维护的问题。
    发布于 2026-10-21 08:25 •IP属地 青海
    举报
    评论
    收藏