【发布时间】:2017-02-11 20:12:55
【问题描述】:
对于以下代码:
func main() {
goRtns := runtime.NumGoroutine()
fmt.Println("goroutines:", goRtns)
}
输出为1。但这是在一个“进程”中,没有明确调用任何 goroutine:
“在计算中,进程是正在执行的计算机程序的一个实例。它包含程序代码及其当前活动。根据操作系统(OS),一个进程可能由多个线程组成执行同时执行指令。”
同样来自 Krishna Sundarram 出色的“goroutines 工作原理”博文:http://blog.nindalf.com/how-goroutines-work/
“创建一个 goroutine 不需要太多内存 - 只需 2kB 的堆栈空间。它们通过根据需要分配和释放堆存储来增长。”
然后,我的问题是:正在运行的代码实例(我的简单 main.go 函数)被运行时库计为 goroutine。我是否假设父进程被视为一个 go 例程,具有相同的内存分配、垃圾收集等规则?假设阅读有关 goroutine 执行的事实类似于运行它的总体 go 进程是否明智?关于上面关于 goroutines 的第二个引用,这听起来像是一个进程在程序执行时增加/缩小其堆栈空间,这是编程中的标准范例。
go 进程和例程是否共享相同的规则?或者我只是错过了关于报告的 goroutine 数量的一些信息。
【问题讨论】:
-
忘记“进程”,这是一个操作系统/用户空间/外行术语。在 GO 中,一切都是 goroutine,它们被安排到线程中。没有“执行过程”(无论这意味着什么)。
-
稍微扩展一下,当你运行一个 go 程序时,它就像运行其他任何东西一样——它只是一个进程(除非程序显式创建其他进程)。 Go 程序中总是至少有一个 goroutine(运行
main的那个)。
标签: memory go process goroutine