Golang Go语言中 怎么理解 goroutine 这个词?

发布于 1周前 作者 nodeper 来自 Go语言

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


Golang Go语言中 怎么理解 goroutine 这个词?
19 回复

协程 (Coroutine), 然后把第一个 C 改成 Go 语言的 G , 就变成了 Goroutine

更多关于Golang Go语言中 怎么理解 goroutine 这个词?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Coroutines for Go

协程版 goto

go 语言里的协程

协程很方便,但不要乱用,有些时候开个子进程比协程方便。

runtime 是运行时

来自 routine ,日程表、定期执行

当轻量级线程使就行了, 还有就是别搞什么池子

goroutine 是 go 语言设计的一种 routine ,和传统理解的 coroutine 是有区别的,会出现线程安全问题

假设有这么个模型系统。

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

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

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

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


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

之后重新被执行流取出队列并调用的 task 会从刚才暂停的状态恢复继续执行过程,并且重试读取网络 socket ,此时会正常读取到数据,继续向下运行。重复上述过程直到一个 task 被执行完成。

本来就有 routine 这个词,指的是事务、日常工作。跟 runtime 没有关系。

goroutine 和 coroutine 的关系约等于 vbscript vs javascript

根本不是什么协程,是一种混合了 OS 线程和语言 runtime 实现的用户空间线程的复杂玩意。goroutine 的调度器既要控制切换用户空间线程的上下文,还要负责维护 OS 线程和 CPU 核心调度,但这些调度过程全都无法通过语言功能手动控制……使用起来必须极其小心(因为不能手动控制线程也意味着你无法写代码显式地控制资源指派,必须永远假定资源处于竞争状态)。

很多编程语言模仿潮流,会改造一个属于自己的词,不需要过度解读。很多框架也有这样的习惯

#14

协程不能强制结束,有些场景根本没法用 context ,之后还要完成清理工作。

我是新手,在初学时发现标准库没有协程的池,查询三方库也基本都支持的很一般或者说没有严肃认真的设计及实现。似乎官方及开发者对协程池化都抱着“不需要”的态度。

我不太理解为什么,对于运行时创建 xx 资源这种事情,我们不是应该严格控制起来防止某些异常或未预料的情况导致频繁或大量创建而拖垮整个服务吗?

runtime 已经做了 goroutine 复用相关的工作,用户层面只需要控制并发

在Golang(通常简称为Go)语言中,goroutine是一个非常重要的概念,它代表了Go语言对并发编程的一种独特且强大的支持方式。

从字面意义上来看,“goroutine”可以看作是“go routine”(Go 例程)的缩写,它指的是一种轻量级的线程。与传统的操作系统线程相比,goroutine的创建和销毁成本极低,这使得Go程序能够高效地管理大量的并发任务。

在Go语言中,启动一个goroutine非常简单,只需在函数调用前加上go关键字即可。这样,Go运行时就会在新的goroutine中异步执行该函数。由于goroutine的调度是由Go运行时自动管理的,因此开发者无需关心底层的线程切换和调度细节。

此外,Go语言还提供了强大的通道(channel)机制,用于在goroutine之间进行通信和同步。通过通道,goroutine可以安全地传递数据,从而实现复杂的并发控制逻辑。

总的来说,goroutine是Go语言并发编程的核心概念之一。它使得开发者能够以简洁、高效的方式编写并发程序,而无需担心底层的线程管理问题。通过合理利用goroutine和通道,Go程序能够充分利用多核处理器的性能,实现高效的并发处理。因此,对于想要深入学习Go语言的开发者来说,理解和掌握goroutine的概念和用法是至关重要的。

回到顶部