我读过的教程和文档都说goroutines是"不是线程"或者"轻量级线程"但通常可以将它们视为自己独立的线程。
那么......他们真的是什么?
答案 0 :(得分:8)
将goroutine与典型的OS线程区分开来:
go
语句本身外,还有channel types和操作以及select
statements来协调goroutines。for{}
循环永远不会被切换掉)。它们与许多其他术语密切相关:
答案 1 :(得分:1)
当有两个CPU时,goroutine(s)作为真实线程运行。当具有单个CPU时,goroutine将作为单个线程的协同例程运行,并在切换其上下文的情况下运行。 goroutine并没有坚持固定的线程。所以它没有像thread-id这样的标识符。如果你想将goroutine作为OS线程,你需要使用runtime.LockOSThread()
。
答案 2 :(得分:0)
This Morsing's blog post about the Go scheduler很不错,因为它有三角形,正方形和圆形的图片。
从调度程序的角度来看:
goroutine包括堆栈,指令指针和其他对调度很重要的信息。