在Google I/O 2012演示文稿Go Concurrency Patterns中,Rob Pike提到一个线程中可以存在多个goroutines.这是否意味着它们被实现为coroutines?如果没有,如何实施?欢迎链接到源代码.

推荐答案

不完全是.Go FAQ部分Why goroutines instead of threads?解释:

Goroutine是使并发性易于使用的一部分.这个 idea 已经有一段时间了,它是将独立执行的函数(协程)多路复用到一组线程上.当协程阻塞时(例如通过调用阻塞系统调用),运行时会自动将同一操作系统线程上的其他协程移动到不同的可运行线程,这样它们就不会被阻塞.程序员对此一无所知,这就是问题所在.我们称之为goroutines的结果可能非常便宜:除了堆栈只有几千字节的内存之外,它们几乎没有开销.

为了使堆栈更小,Go的运行时使用可调整大小的有界堆栈.一个新造的Goroutine被赋予几千字节,这几乎总是足够的.如果不是这样,运行时会增加(和缩小)用于自动存储堆栈的内存,从而允许许多Goroutine在适度的内存中运行.每个函数调用的CPU开销平均约为3条廉价指令.在同一地址空间中创建数十万个Goroutine是可行的.如果goroutines仅仅是线程,那么系统资源耗尽的数量会少得多.

Go相关问答推荐

JWT库返回及时无效的令牌有效

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

获取k8s群集作用域运算符的命名空间

如何使用Gio设置标题栏图标

通过代理从golang连接到ftp

无法使用exec从管道中读取.Go中的命令

Kusto Go API 从多个表查询

一个Go module可以和之前的非module模块发布在同一个路径下吗?

从 eBPF LRU 哈希映射中错误驱逐的元素

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

如何匹配两次出现的相同但随机字符串之间的字符

如何为导入的嵌入式 struct 文字提供值?

仅在工作日运行 cron

Golang - 客户 Unmarshaler/Marshaler 在指针上具有 nil/null 值

使用 package`regexp` 查找 Golang 中的所有 mactch 子字符串,但得到意外结果

在删除级联时无法在 Gorm 中按预期工作

Go 并发、goroutine 同步和关闭通道

无限期运行 Go routine (完成后重新启动)

函数的递归调用以 goroutine 和惯用方式开始,以在所有工作 goroutine 完成时继续调用者

Golang 泛型