V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
YanSeven

goroutine 到底算不算一种 coroutine 的实现?

  •  
  •   YanSeven · Oct 27, 2025 · 3167 views
    This topic created in 188 days ago, the information mentioned may be changed or developed.
    之前看论坛里有主题在讨论 goroutine 说不是协程。

    那 coroutine 从原始定义上是什么,为了解决什么问题的。goroutine 是为了解决同样的课题吗?
    其他经典编程语言中如何看待和实现 coroutine 的呢。
    13 replies    2025-11-12 10:47:07 +08:00
    moudy
        1
    moudy  
       Oct 27, 2025
    windows 3.x 以及带着 gil 的 python thread 本质就是 coroutine:合作式多任务,谁不用 cpu 就把 cpu 让出来给别人。缺点是有一个卡死不让 cpu 的,别人也没办法抢 cpu 过来。好处是可以省去大量的同步处理,减少程序对数据一致性的管理开销,最大化利用(单核) cpu 时间做真正有用的事情。

    goroutine 是并行运行的,算是轻量化的线程。
    Dorathea
        2
    Dorathea  
       Oct 27, 2025
    以下是自己的想法:

    [Coroutine 的定义]( https://en.wikipedia.org/wiki/Coroutine)是协作式多线程
    其中 co 是 cooperative. [Cooperative 的定义]( https://en.wikipedia.org/wiki/Cooperative_multitasking)

    golang 是没有 yield 主动放弃线程的, routine 之间除了等待 IO 和 system call 或者其他特殊情况外, 本质是抢占资源, 协程之间协作更多的是用 channel.

    好像 golang 也没说过自己是 Coroutine, 文档中说的都是 routine. 为什么会和 Coroutine 联想到一起呢?
    YanSeven
        3
    YanSeven  
    OP
       Oct 27, 2025
    @Dorathea 因为基本上所有的中文资料都叫”go 协程“,望文生义字面上理解的话,意思就像是 go 的 coroutine 实现。
    Knuth
        4
    Knuth  
       Oct 27, 2025 via iPhone
    n*m ,类似于 bthread
    newtype0092
        5
    newtype0092  
       Oct 28, 2025   ❤️ 1
    @YanSeven 本末倒置了吧,难道不是因为人家是照着 coroutine 取名 goroutine 才被翻译成 go 协程的么。。。
    liaohongxing
        6
    liaohongxing  
       Oct 28, 2025
    一般的协程不带栈的那种吧 ,比如 python nodejs ,感觉都是状态机或者事件循环实现的。

    高级点的协程都是有栈的,比如 java 的虚拟线程,go 的协程,这种有栈的就相当于一个线程了,只是轻量级。

    go 的协程又范围扩大了一点,包含了 GMP 模型调度方式。起了名字叫 goroutine 。
    lovelylain
        7
    lovelylain  
       Oct 28, 2025
    协程有无栈协程(例如 python 的 async/await )和有栈协程(例如 python 的 gevent ),goroutine 显然不是无栈协程,但它与有栈协程的区别是它是多线程的。如果把协程理解为协作式多任务,goroutine 类似线程的抢占式多任务不能算是协程。
    至于 goroutine 的翻译,不翻译太啰嗦,人家英文单词都只是 coroutine 改了首字母,翻译为 go 协程显然也合理。
    lzgshsj
        8
    lzgshsj  
       Oct 28, 2025
    我看的翻译倒是叫 GO 程,虽然有点怪怪的😂
    realpg
        9
    realpg  
    PRO
       Oct 28, 2025
    你纠结这些本质不是技术问题 本质是语言学翻译学问题

    以前我经手过一个项目有个吉祥物, 是两只兔耳的造型的小人,整体连着的 这个吉祥物是有名字的, 叫"小白 two"
    这玩意你说怎么翻译成英语

    goroutine 是人家生造出来的词 没法恰当翻译成中文 只能近似翻译造成误解
    ycp
        10
    ycp  
       Oct 29, 2025
    https://en.wikipedia.org/wiki/Coroutine
    说白了就是更加轻量级的实现并发执行,比如 web 这种 io 密集的场景,最开始是多进程,然后是多线程,多线程也显得浪费资源了,解决不了 c10k ( 1 万个并发)的问题,还有基于事件回调的 IO 处理机制,比如 redis nginx ,但是它是单线程的不能有效的利用多核。go 的协程通过 GMP 能够通过 g 以非常小的代价就能处理一个并发了,通过逻辑队列 p 和系统线程 M 绑定,实现协程和内核线程的解耦和复用,充分利用多核又不用频繁切换协程(协程不能直接执行,是用户态的,内核的最小调度单位是线程)。go 的运行时实现了抢占调度,也可以手动让出协程。
    fkdtz
        11
    fkdtz  
       Oct 29, 2025
    个人认为 goroutine 并不算是协程,或者说不再是纯粹的协程,而是一种用户空间的轻量级线程
    bengcaca
        12
    bengcaca  
       Oct 29, 2025
    个人理解 goroutine 才是真协程,其他类似 kotlin 等都不是真协程或者是所谓的无栈协程。

    这里便最核心的点是对于 cpu 利用率的优化,而无栈协程做不到这一点,无栈协程能做的是开发者友好,只有有栈协程才能做到 cpu 利用率的优化,这种才应该是真协程。
    iseki
        13
    iseki  
       Nov 12, 2025 via Android
    @bengcaca 如果你指 parallel ,Kotlin coroutine 同样可以,使用 Default Dispatcher 即可
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   793 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 20:27 · PVG 04:27 · LAX 13:27 · JFK 16:27
    ♥ Do have faith in what you're doing.