goroutine 到底算不算一种 coroutine 的实现? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
YanSeven
V2EX    Go 编程语言

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

  •  
  •   YanSeven 2 天前 1867 次点击
    之前看论坛里有主题在讨论 goroutine 说不是协程。

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

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

    [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
       2 天前
    @Dorathea 因为基本上所有的中文资料都叫”go 协程“,望文生义字面上理解的话,意思就像是 go 的 coroutine 实现。
    Knuth
        4
    Knuth  
       2 天前 via iPhone
    n*m ,类似于 bthread
    newtype0092
        5
    newtype0092  
       2 天前   1
    @YanSeven 本末倒置了吧,难道不是因为人家是照着 coroutine 取名 goroutine 才被翻译成 go 协程的么。。。
    liaohongxing
        6
    liaohongxing  
       2 天前
    一般的协程不带栈的那种吧 ,比如 python nodejs ,感觉都是状态机或者事件循环实现的。

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

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

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

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

    这里便最核心的点是对于 cpu 利用率的优化,而无栈协程做不到这一点,无栈协程能做的是开发者友好,只有有栈协程才能做到 cpu 利用率的优化,这种才应该是真协程。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4512 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 05:36 PVG 13:36 LAX 22:36 JFK 01:36
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86