【问题标题】:What are the three background goroutines in a Go program?Go 程序中的三个后台 goroutine 是什么?
【发布时间】:2014-11-03 01:44:15
【问题描述】:

Go 似乎总是至少有 4 个 goroutine 在任何给定时间运行。另外三个不是主要的 goroutine 是什么?

http://play.golang.org/p/MQBiLmHXBK

package main

import (
    "fmt"
    "runtime"
)

func main() {
    fmt.Println(runtime.NumGoroutine()) //4
}

【问题讨论】:

    标签: go goroutine


    【解决方案1】:

    那些不是线程,它们是 goroutine,并且数量可能会根据当前的实现而有所不同(即在 go1.2 中它会打印 2)。

    现在,main 似乎有 1 个,runtime/gc 有 3 个。

    import "fmt"
    
    func main() {
        fmt.Println(func() string { panic(nil); return "" }())
    }
    

    这表明

    goroutine 16 [running]:
    runtime.panic(0x0, 0x0)
        /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
    main.func·001(0x3ea4f, 0xdc4b0)
        /test/threads.go:6 +0x28
    main.main()
        /test/threads.go:6 +0x1e
    
    goroutine 17 [runnable]:
    runtime.MHeap_Scavenger()
        /usr/local/go/src/pkg/runtime/mheap.c:507
    runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445
    
    goroutine 18 [runnable]:
    bgsweep()
        /usr/local/go/src/pkg/runtime/mgc0.c:1976
    runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445
    
    goroutine 19 [runnable]:
    runfinq()
        /usr/local/go/src/pkg/runtime/mgc0.c:2606
    runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445
    

    如果你删除 fmt,并使用引导 print 函数,你只会得到 2 个 goroutine。

    import "runtime"
    
    func main() {
        print(runtime.NumGoroutine(), "\n")
    }
    
    // prints 2
    

    如果您想确切知道哪些 goroutine 正在运行,请打印堆栈跟踪、调用 panic 或使用 SIGQUIT 终止进程(打印堆栈跟踪并退出)。如果您运行绝对最小程序,您可以从中获得堆栈跟踪,您可以看到 2 个 goroutine:

    package main
    
    func main() {
        panic(nil)
    }
    

    Goroutines 非常便宜,许多 事物会启动和停止更多的 goroutines,因此尝试跟踪它们的下限并不是很有用。请注意,即使只有 2 个 goroutine(main/runtime.panic 和 runtime.MHeap_Scavenger),计数已经达到 17 个。

    panic: nil
    
    goroutine 16 [running]:
    runtime.panic(0x0, 0x0)
        /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
    main.main()
        /test/threads.go:4 +0x28
    
    goroutine 17 [runnable]:
    runtime.MHeap_Scavenger()
        /usr/local/go/src/pkg/runtime/mheap.c:507
    runtime.goexit()
        /usr/local/go/src/pkg/runtime/proc.c:1445
    exit status 2
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 2015-03-02
      • 2017-01-22
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      相关资源
      最近更新 更多