[英]Is a process the same as a Goroutine in Golang?
对于以下代码:
func main() {
goRtns := runtime.NumGoroutine()
fmt.Println("goroutines:", goRtns)
}
输出为1
。 但这是在一个“过程”中,没有明确调用goroutines:
“在计算中,进程是正在执行的计算机程序的实例。它包含程序代码及其当前活动。根据操作系统(OS),进程可以由执行的多个执行线程组成同时说明。“
还有来自Krishna Sundarram的优秀“How goroutines work”博客文章: http : //blog.nindalf.com/how-goroutines-work/
“创建一个goroutine不需要太多内存 - 只有2kB的堆栈空间。它们通过根据需要分配和释放堆存储来增长。”
我的问题是,然后:正在运行的代码实例(我的简单main.go函数)被运行时库计为goroutine。 我是否假设父进程被视为go例程,具有相同的内存分配,垃圾收集等规则? 假设阅读一个关于goroutine执行的事实类似于运行它的总体进程是否明智? 关于上面关于goroutines的第二个引用,这听起来像一个程序在程序执行时增加/缩小其堆栈空间的过程,这是编程中的标准范例。
流程和例程是否共享相同的规则? 或者我只是遗漏了报道的goroutines数量。
一个过程和Golang中的Goroutine一样吗?
您在这里使用了错误的术语process
。 在GO中,一切都是goroutine。 正如沃尔克所说。 你可以从这里看到gouroutine的定义:
goroutine是由Go运行时管理的轻量级线程。
例如在你的代码中
func main() {
goRtns := runtime.NumGoroutine()
fmt.Println("goroutines:", goRtns)
}
这只有一个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)
}
你可以在这里找到sq和gen功能。 现在runtime.NumGoroutine()
将有5个gorutine。 由于内部函数gen
和sq
,我们go
打来电话,我们结合主题这里的总数是4 +的main
最后的结果是5。
你必须小心Go中的术语过程 。 您引用了一个关于被称为进程的操作系统实体的定义,这些实体将被广泛认可。 很多人会理解这种用法。
但这个词过载了。 CAR Hoare的工作对我们也很重要:在他的通信顺序过程 (CSP)代数中,术语过程指的是一些小东西 - 更像是一个超轻量级的线程。 他的代数属于一类称为过程代数的数学。
因此,假设goroutine是Go的CSP 流程实现是公平的。
在这方面,围棋就像是一部陈旧的语言,奥卡姆。 在Occam中,流程意味着CSP流程。 Occam被广泛用于裸机(即无操作系统)嵌入式编程,因此在术语过程中从不存在任何歧义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.