为什么只有 go 语言原生支持协程?

273 天前
 wmwm

大部分语言的协程都是基于 epoll/select 机制,由于 epoll/select 只能处理 IO 问题,所以导致大部分语言的协程也只能处理 IO 问题

而 go 语言的协程可以在任何情况下使用,是真正意义上的协程,底层是通过汇编指令 pop/push 保存上下文

以上理解正确吗?

6522 次点击
所在节点    程序员
46 条回复
nightwitch
273 天前
把协程的实现放到库来做还是放到语言特性里只是语言设计者的偏好问题。协程和 epoll 也是正交的关系,没什么基于不基于的。
thinkershare
273 天前
因为协程并不是什么先进值得被其它语言吸收的好东西,纯粹是语言创建者的个人偏好。
coderxy
273 天前
因为现在流行的几个语言里面,就属 go 诞生的最晚,其它语言有一定的历史包袱。
tulongtou
273 天前
Java 也原生支持了
emSaVya
273 天前
你可能需要重新理解协程的概念。

另外应该是 2015 年前后 大批程序设计语言都上了 coroutine, 比如 c# js python 。什么概念时髦了就上什么。

c++ coroutine 讨论了得有几十年了, 现在 c20 也加上了。
duke807
273 天前
各语言协程的底层都是通过汇编指令 pop/push 保存上下文
lovelylain
273 天前
@duke807 async/await 这种是状态机
agagega
273 天前
协程和用户态线程是不同的东西,只是 go 利用特殊设计在后者实现了前者的要达到的效果。Swift 的并发支持也有点异曲同工之妙
sunny1688
273 天前
yield 就是协程,很多语言都支持协程的,只不过没有语言层面实现调度器(运行时)
touchmii
273 天前
就一个 runtime 的事情, 想支持啥特性都可以, 至于 go 为什么要放到语言特性中来自然是要宣传造势, 这是它最显著的特点.
kenvix
272 天前
先问是不是,再问为什么。
GeekGao
272 天前
x y problem
oldshensheep
272 天前
golang 的协程有两种抢占式和协作式,抢占式类似于 Java 的虚拟线程,协作式类似于 yield
支持类似于 Golang 的抢占式的协程的语言有 Java ,其他的语言好像不怎么支持
nuk
272 天前
golang 从来都没有协程,goroutine 本质上是 M:N 的用户线程。
官方的说法:
A goroutine is a lightweight thread managed by the Go runtime.
WebKit
272 天前
Kotlin 也支持
ravenl
272 天前
go 的协程还没出啊
https://research.swtch.com/coro
AItsuki
272 天前
goroutine 确实不是协程。协程最关键的一点是非抢占式调度,可以显式的挂起和恢复,而不是阻塞。
ikas
272 天前
不正确
wangritian
272 天前
不懂,但 goroutine+channel 做 IO 并发真的超爽
lightjiao
272 天前

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

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

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

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

© 2021 V2EX