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

1 天前
 YanSeven
之前看论坛里有主题在讨论 goroutine 说不是协程。

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

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

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1168763

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX