【问题标题】:Is a process the same as a Goroutine in Golang?进程和 Golang 中的 Goroutine 一样吗?
【发布时间】: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


【解决方案1】:

进程和Golang中的Goroutine一样吗?

您在这里使用了错误的术语process。在 GO 中,一切都是 goroutine。正如Volker 所说。你可以从here看到gouroutine定义:

goroutine 是由 Go 运行时管理的轻量级线程。

例如在你的代码中

func main() {
    goRtns := runtime.NumGoroutine()
    fmt.Println("goroutines:", goRtns)
}

this 只有一个 goroutine,因为它只有 main 函数,并且内部没有 go 调用这里。它只是打印给定变量中的内容。

另一个例子,如果你在你的函数main 中调用了go

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。由于内部函数gensq 我们调用了go,我们在这里结合主题,总数为4 + main,最终结果为5。

【讨论】:

    【解决方案2】:

    你必须小心 Go 中的术语 process。您引用了一个名为进程的操作系统实体的定义,该定义将被广泛识别。很多人都会理解这种用法​​。

    但是这个词是超载的。 C.A.R. 的工作Hoare 对我们也很重要:在他的 Communicating Sequential Processes (CSP) 代数中,process 一词指的是一些小东西——更像是一个超轻量级线程。他的代数属于数学范畴,称为过程代数

    因此,可以公平地假设 goroutine 是 Go 对 CSP 进程 的实现。

    在这方面,Go 就像一门更古老的语言,Occam。在 Occam 中,进程意味着 CSP 进程。 Occam 被广泛用于裸机(即无操作系统)嵌入式编程,因此对于 process 一词从来没有任何歧义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2015-12-07
      • 2022-01-16
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多