abg*_*don 5 memory process go goroutine
对于以下代码:
func main() {
goRtns := runtime.NumGoroutine()
fmt.Println("goroutines:", goRtns)
}
Run Code Online (Sandbox Code Playgroud)
输出为1
。但这是在“过程”中,没有goroutines被明确调用:
“在计算中,进程是正在执行的计算机程序的实例。它包含程序代码及其当前活动。根据操作系统(OS),进程可能由多个执行线程组成,这些线程执行指令同时进行。”
同样来自克里希纳·桑达拉姆(Krishna Sundarram)出色的“ goroutines如何工作”博客文章:http : //blog.nindalf.com/how-goroutines-work/
“创建goroutine不需要太多的内存,仅需要2kB的堆栈空间。它们可以通过根据需要分配和释放堆存储来增长。”
那么我的问题是:运行时库将正在运行的代码实例(我简单的main.go函数)计为goroutine。我是否假定父进程被视为go例程,并且具有相同的内存分配,垃圾回收等规则?假设读取有关goroutine执行的事实与运行它的总体go进程类似,是否明智?关于上面关于goroutine的第二个引号,这听起来像是一个程序在执行程序时增大/缩小其堆栈空间的过程,这是编程的标准范例。
go流程和例程是否共享相同的规则?还是我只是缺少有关报告的goroutine数量的信息。
进程和 Golang 中的 Goroutine 一样吗?
您在这里使用了错误的术语process
。在 GO 中,一切都是 goroutine。正如沃尔克所说。你可以从这里看到 goroutine 定义:
Goroutine 是由 Go 运行时管理的轻量级线程。
例如在你的代码中
func main() {
goRtns := runtime.NumGoroutine()
fmt.Println("goroutines:", goRtns)
}
Run Code Online (Sandbox Code Playgroud)
this 只有一个 goroutine,因为它只有main
函数,并且内部没有go
调用。它只是打印给定变量中的内容。
另一个例子,如果你go
调用了你的函数main
:
func main() {
result := sq(sq(sq(gen(1, 2, 3, 4))))
numGoroutines := runtime.NumGoroutine()
fmt.Println("number goroutine = ", numGoroutines)
fmt.Println(<-result)
fmt.Println(<-result)
fmt.Println(<-result)
fmt.Println(<-result)
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到 sq 和 gen 函数。现在runtime.NumGoroutine()
将有 5 个 Gorutine。由于在函数内部我们已经调用gen
并且我们在这里组合主题,总数将是 4 +最终结果是 5。sq
go
main