流程与Golang中的Goroutine一样吗?

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数量的信息。

Guj*_*ana 5

进程和 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。sqgomain