【问题标题】:How many goroutines are started by default in a Go program?Go 程序中默认启动了多少个 goroutine?
【发布时间】:2015-03-02 01:04:23
【问题描述】:
package main

import (
    //"time"
    "runtime"
    "fmt"
)

func main() {
    //time.Sleep(100 * time.Millisecond)//By adding this number of goroutine increases
fmt.Println(runtime.NumGoroutine())
}

我正在尝试找出程序中 goroutine 的数量。我的code is here。在编写代码时,我注意到 goroutines 的默认数量是 4。

对我来说:

  • main 是一个 goroutine
  • 垃圾收集器是一个 goroutine

其他的呢?

通过添加 time.Sleep(上图),goroutine 的数量增加到 5 个。这是什么原因?

【问题讨论】:

  • 你可以使用 SIGQUIT(ctrl+\) 打印出所有的 goroutines。
  • @chendesheng:感谢您的建议,但它没有回答我的问题,为什么上面的程序有 4 个 goroutine,当我添加 Sleep 时,为什么数字会增加到 5?

标签: go goroutine


【解决方案1】:

实际上,内存管理需要不止一个 goroutine ...

4 个初始的 goroutine 是:

  • 主协程
  • 后台清扫器(垃圾收集的并发阶段)
  • 清道夫(也是垃圾收集器的一部分)
  • 终结器 goroutine(专门运行最终附加到对象的 finalizers

然后,调用 time.Sleep 函数。它需要一个计时器。定时器是在运行时通过一个额外的 goroutine (timerproc) 实现的,它处理存储在定时器堆中的事件。当第一个计时器添加到堆中时,这个 goroutine 会延迟启动。

因此,你最终得到了 5 个 goroutine。

【讨论】:

  • 当然这完全取决于实现。 Go 的下一个版本可以任意添加或删除由运行时(或标准包中的任何其他位置)启动的 goroutine。更不用说 gcgccgo 的差异了。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多