[Go 语言] 怎么理解 goroutine 这个词?

2023-08-10 11:05:36 +08:00
 miaeLKK

最近新学习,知道他大概是 Go 自己创建维护的线程。想了解下这个词怎么来的,有什么含义,感觉可以更好的理解。(我貌似看到一个单词 runtime ,不知道是不是这么来的) 另外,想听到对于新手的建议、对 Go 的个人理解等关于 Go 的一切话题,请大家畅所欲言

2349 次点击
所在节点    Go 编程语言
18 条回复
Nooooobycat
2023-08-10 11:06:31 +08:00
协程 (Coroutine), 然后把第一个 C 改成 Go 语言的 G , 就变成了 Goroutine
arischow
2023-08-10 11:07:31 +08:00
Coroutines for Go
yazinnnn
2023-08-10 11:07:33 +08:00
协程版 goto
fzls
2023-08-10 11:09:01 +08:00
go 语言里的协程
flyqie
2023-08-10 11:11:58 +08:00
协程很方便,但不要乱用,有些时候开个子进程比协程方便。
me1onsoda
2023-08-10 11:23:37 +08:00
runtime 是运行时
kiwi95
2023-08-10 11:29:53 +08:00
来自 routine ,日程表、定期执行
Nazz
2023-08-10 11:38:15 +08:00
当轻量级线程使就行了, 还有就是别搞什么池子
zagfai
2023-08-10 12:29:15 +08:00
goroutine 是 go 语言设计的一种 routine ,和传统理解的 coroutine 是有区别的,会出现线程安全问题
PTLin
2023-08-10 12:30:57 +08:00
假设有这么个模型系统。

其中调用函数的动作不会实际调用这个函数,会返回一个叫做 task 的结构。

有多个并行的执行流 例如多个线程,每个执行流有一个队列,创建的 task 会被放入这个队列。

每个执行流会取出队列中的一个 task 进行实际的调用。

系统中会提供一些特殊的函数,这些函数会暂停 task 的运行并且返回 task 未完成的状态,例如一个读取网络 socket 的函数,在无数据可读堵塞的情况下会暂停 task ,也就是暂停函数过程的执行停止到这个点上,返回 task 未完成。


并且这时候这个特殊函数会向系统中注册一些信息,这些信息可以确保当满足某些情况下,这个未完成的 task 会被放回队列。例如当此 socket 进入了可读状态,系统就会把这个未完成的 task 放回某个队列,等待执行流执行。

之后重新被执行流取出队列并调用的 task 会从刚才暂停的状态恢复继续执行过程,并且重试读取网络 socket ,此时会正常读取到数据,继续向下运行。重复上述过程直到一个 task 被执行完成。
darkengine
2023-08-10 12:35:27 +08:00
本来就有 routine 这个词,指的是事务、日常工作。跟 runtime 没有关系。
GeruzoniAnsasu
2023-08-10 13:05:51 +08:00
goroutine 和 coroutine 的关系约等于 vbscript vs javascript

根本不是什么协程,是一种混合了 OS 线程和语言 runtime 实现的用户空间线程的复杂玩意。goroutine 的调度器既要控制切换用户空间线程的上下文,还要负责维护 OS 线程和 CPU 核心调度,但这些调度过程全都无法通过语言功能手动控制……使用起来必须极其小心(因为不能手动控制线程也意味着你无法写代码显式地控制资源指派,必须永远假定资源处于竞争状态)。
wmwm
2023-08-10 13:17:37 +08:00
很多编程语言模仿潮流,会改造一个属于自己的词,不需要过度解读。很多框架也有这样的习惯
b00tyhunt3r
2023-08-10 13:20:40 +08:00
@flyqie for example?
misaka19000
2023-08-10 13:37:24 +08:00
flyqie
2023-08-10 14:26:01 +08:00
@b00tyhunt3r #14

协程不能强制结束,有些场景根本没法用 context ,之后还要完成清理工作。
sherlockfff
2023-09-11 00:14:21 +08:00
@Nazz 我是新手,在初学时发现标准库没有协程的池,查询三方库也基本都支持的很一般或者说没有严肃认真的设计及实现。似乎官方及开发者对协程池化都抱着“不需要”的态度。

我不太理解为什么,对于运行时创建 xx 资源这种事情,我们不是应该严格控制起来防止某些异常或未预料的情况导致频繁或大量创建而拖垮整个服务吗?
Nazz
2023-09-11 08:05:55 +08:00
@sherlockfff runtime 已经做了 goroutine 复用相关的工作,用户层面只需要控制并发

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

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

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

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

© 2021 V2EX