记忆 – 一个过程和Golang中的Goroutine一样吗?
对于以下代码:
func main() { goRtns := runtime.NumGoroutine() fmt.Println("goroutines:",goRtns) } 输出为1.但这是在一个“进程”内,没有明确调用goroutine: “在计算中,进程是正在执行的计算机程序的实例.它包含程序代码及其当前活动.根据操作系统(OS),进程可以由执行的多个执行线程组成同时说明.“ 此外,来自Krishna Sundarram的优秀“How goroutines work”博客文章:http://blog.nindalf.com/how-goroutines-work/ “创建一个goroutine不需要太多内存 – 只有2kB的堆栈空间.它们通过根据需要分配和释放堆存储来增长.” 我的问题是,然后:正在运行的代码实例(我的简单main.go函数)被运行时库计为goroutine.我是否假设父进程被视为go例程,具有相同的内存分配,垃圾收集等规则?假设阅读一个关于goroutine执行的事实类似于运行它的总体进程是否明智?关于上面关于goroutines的第二个引用,这听起来像一个程序在程序执行时增加/缩小其堆栈空间的过程,这是编程中的标准范例. 流程和例程是否共享相同的规则?或者我只是遗漏了报道的goroutines数量. 解决方法
您在这里使用了错误的术语流程.在GO中,一切都是goroutine.正如Volker所说.你可以从here看到gouroutine的定义:
例如在你的代码中 func main() { goRtns := runtime.NumGoroutine() fmt.Println("goroutines:",goRtns) } 这只有一个goroutine,因为它只有主要功能,里面没有去调用这里.它只是打印给定变量的东西. 另一个例子,如果你在函数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) } 你可以找到sq和gen函数here.现在runtime.NumGoroutine()将有5个gorutine.由于内部函数gen和sq我们已经调用了,我们在这里结合主题总数将是4,主要是最终结果为5. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |