最近新学习,知道他大概是 Go 自己创建维护的线程。想了解下这个词怎么来的,有什么含义,感觉可以更好的理解。(我貌似看到一个单词 runtime ,不知道是不是这么来的) 另外,想听到对于新手的建议、对 Go 的个人理解等关于 Go 的一切话题,请大家畅所欲言
1
Nooooobycat 2023-08-10 11:06:31 +08:00 1
协程 (Coroutine), 然后把第一个 C 改成 Go 语言的 G , 就变成了 Goroutine
|
2
arischow 2023-08-10 11:07:31 +08:00 1
Coroutines for Go
|
3
yazinnnn 2023-08-10 11:07:33 +08:00
协程版 goto
|
4
fzls 2023-08-10 11:09:01 +08:00
go 语言里的协程
|
5
flyqie 2023-08-10 11:11:58 +08:00 via Android
协程很方便,但不要乱用,有些时候开个子进程比协程方便。
|
6
me1onsoda 2023-08-10 11:23:37 +08:00
runtime 是运行时
|
7
kiwi95 2023-08-10 11:29:53 +08:00 via Android
来自 routine ,日程表、定期执行
|
8
Nazz 2023-08-10 11:38:15 +08:00
当轻量级线程使就行了, 还有就是别搞什么池子
|
9
zagfai 2023-08-10 12:29:15 +08:00
goroutine 是 go 语言设计的一种 routine ,和传统理解的 coroutine 是有区别的,会出现线程安全问题
|
10
PTLin 2023-08-10 12:30:57 +08:00
假设有这么个模型系统。
其中调用函数的动作不会实际调用这个函数,会返回一个叫做 task 的结构。 有多个并行的执行流 例如多个线程,每个执行流有一个队列,创建的 task 会被放入这个队列。 每个执行流会取出队列中的一个 task 进行实际的调用。 系统中会提供一些特殊的函数,这些函数会暂停 task 的运行并且返回 task 未完成的状态,例如一个读取网络 socket 的函数,在无数据可读堵塞的情况下会暂停 task ,也就是暂停函数过程的执行停止到这个点上,返回 task 未完成。 并且这时候这个特殊函数会向系统中注册一些信息,这些信息可以确保当满足某些情况下,这个未完成的 task 会被放回队列。例如当此 socket 进入了可读状态,系统就会把这个未完成的 task 放回某个队列,等待执行流执行。 之后重新被执行流取出队列并调用的 task 会从刚才暂停的状态恢复继续执行过程,并且重试读取网络 socket ,此时会正常读取到数据,继续向下运行。重复上述过程直到一个 task 被执行完成。 |
11
darkengine 2023-08-10 12:35:27 +08:00
本来就有 routine 这个词,指的是事务、日常工作。跟 runtime 没有关系。
|
12
GeruzoniAnsasu 2023-08-10 13:05:51 +08:00
goroutine 和 coroutine 的关系约等于 vbscript vs javascript
根本不是什么协程,是一种混合了 OS 线程和语言 runtime 实现的用户空间线程的复杂玩意。goroutine 的调度器既要控制切换用户空间线程的上下文,还要负责维护 OS 线程和 CPU 核心调度,但这些调度过程全都无法通过语言功能手动控制……使用起来必须极其小心(因为不能手动控制线程也意味着你无法写代码显式地控制资源指派,必须永远假定资源处于竞争状态)。 |
13
wmwm 2023-08-10 13:17:37 +08:00
很多编程语言模仿潮流,会改造一个属于自己的词,不需要过度解读。很多框架也有这样的习惯
|
14
b00tyhunt3r 2023-08-10 13:20:40 +08:00
@flyqie for example?
|
15
misaka19000 2023-08-10 13:37:24 +08:00 via Android
|
16
flyqie 2023-08-10 14:26:01 +08:00 via Android
|
17
sherlockfff 2023-09-11 00:14:21 +08:00
@Nazz 我是新手,在初学时发现标准库没有协程的池,查询三方库也基本都支持的很一般或者说没有严肃认真的设计及实现。似乎官方及开发者对协程池化都抱着“不需要”的态度。
我不太理解为什么,对于运行时创建 xx 资源这种事情,我们不是应该严格控制起来防止某些异常或未预料的情况导致频繁或大量创建而拖垮整个服务吗? |
18
Nazz 2023-09-11 08:05:55 +08:00 via Android
@sherlockfff runtime 已经做了 goroutine 复用相关的工作,用户层面只需要控制并发
|