简体   繁体   English

Go程序中的三个背景goroutines是什么?

[英]What are the three background goroutines in a Go program?

Go seems to always have at least 4 goroutines running at any given time. Go似乎总是在任何给定时间运行至少4个goroutines。 What are the other three that are not the main goroutine? 还有哪三个不是主要的goroutine?

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

package main

import (
    "fmt"
    "runtime"
)

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

Those aren't threads, they're goroutines, and the number may vary based on current implementation (ie in go1.2 it would have printed 2). 那些不是线程,它们是goroutines,并且数量可能根据当前的实现而变化(即在go1.2中它将打印2)。

Right now, it looks like you have 1 for main , and 3 for runtime/gc. 现在,看起来你有1个用于main ,3个用于runtime / gc。

import "fmt"

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

This shows 由此可见

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

if you remove fmt, and use the bootstrapping print function you only get 2 goroutines. 如果你删除fmt,并使用bootstrapping print功能,你只能获得2个goroutines。

import "runtime"

func main() {
    print(runtime.NumGoroutine(), "\n")
}

// prints 2

If you ever want to know exactly what goroutines are running, print a stack trace, call panic, or kill the process with SIGQUIT (which prints a stack trace and exits). 如果你想知道goroutine正在运行什么,打印堆栈跟踪,调用恐慌,或使用SIGQUIT(打印堆栈跟踪并退出)终止进程。 If you run the absolute minimum program you can get a stack trace from you can see the 2 goroutines: 如果您运行绝对最小程序,您可以从中获得堆栈跟踪,您可以看到2个goroutines:

package main

func main() {
    panic(nil)
}

Goroutines are very inexpensive, and many things will start and stop more goroutines, so trying to track their lower bound isn't very useful. Goroutines非常便宜, 许多东西会启动和停止更多的goroutines,所以试图追踪它们的下限并不是很有用。 Notice how even though there's only 2 goroutines, (main/runtime.panic, and runtime.MHeap_Scavenger), the count is already up to 17. 请注意,即使只有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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM