英文:
What is the default goroutine?
问题
以下是要翻译的内容:
以下代码打印出2009/11/10 23:00:00 Num of goroutines: 1
。有没有办法知道它是哪个 goroutine?
package main
import (
"log"
"runtime"
)
func main() {
r := runtime.NumGoroutine()
log.Println("Num of goroutines: ", r)
}
链接:https://play.golang.org/p/pFOG6EQEYb
英文:
The following code prints 2009/11/10 23:00:00 Num of goroutines: 1
. Is there a way to know which go routine it is?
package main
import (
"log"
"runtime"
)
func main() {
r := runtime.NumGoroutine()
log.Println("Num of goroutines: ", r)
}
答案1
得分: 2
这是主要的goroutine,封装了主线程的执行。例如,在你的示例程序中,你可以通过打印goroutine堆栈跟踪来观察到这一点:
package main
import (
"log"
"os"
"runtime"
"runtime/pprof"
)
func main() {
r := runtime.NumGoroutine()
log.Println("goroutine数量:", r)
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
}
运行结果如下:
2009/11/10 23:00:00 goroutine数量: 1
goroutine profile: total 1
1 @ 0xa22a0 0xa1fc0 0x9d640 0x20180 0x5a0a0 0x98e81
# 0xa229f runtime/pprof.writeRuntimeProfile+0xdf /usr/local/go/src/runtime/pprof/pprof.go:614
# 0xa1fbf runtime/pprof.writeGoroutine+0x9f /usr/local/go/src/runtime/pprof/pprof.go:576
# 0x9d63f runtime/pprof.(*Profile).WriteTo+0xff /usr/local/go/src/runtime/pprof/pprof.go:298
# 0x2017f main.main+0x17f /tmp/sandbox832735226/main.go:13
# 0x5a09f runtime.main+0x39f /usr/local/go/src/runtime/proc.go:183
注意到堆栈跟踪的底部是runtime.main
。
当程序在转储跟踪时有两个活动的goroutine:
package main
import (
"log"
"os"
"runtime"
"runtime/pprof"
)
func main() {
c := make(chan int)
go func() { <-c }()
r := runtime.NumGoroutine()
log.Println("goroutine数量:", r)
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
}
运行结果如下:
2009/11/10 23:00:00 goroutine数量: 2
goroutine profile: total 2
1 @ 0x20220 0x98f61
# 0x20220 main.main.func1+0x0 /tmp/sandbox584983760/main.go:12
1 @ 0xa2380 0xa20a0 0x9d720 0x201e0 0x5a180 0x98f61
# 0xa237f runtime/pprof.writeRuntimeProfile+0xdf /usr/local/go/src/runtime/pprof/pprof.go:614
# 0xa209f runtime/pprof.writeGoroutine+0x9f /usr/local/go/src/runtime/pprof/pprof.go:576
# 0x9d71f runtime/pprof.(*Profile).WriteTo+0xff /usr/local/go/src/runtime/pprof/pprof.go:298
# 0x201df main.main+0x1df /tmp/sandbox584983760/main.go:15
# 0x5a17f runtime.main+0x39f /usr/local/go/src/runtime/proc.go:183
英文:
It's the main goroutine, encapsulating the main thread of execution. You might for instance observe that by printing goroutine stack traces in your example program:
package main
import (
"log"
"os"
"runtime"
"runtime/pprof"
)
func main() {
r := runtime.NumGoroutine()
log.Println("Num of goroutines: ", r)
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
}
Which produces the following:
2009/11/10 23:00:00 Num of goroutines: 1
goroutine profile: total 1
1 @ 0xa22a0 0xa1fc0 0x9d640 0x20180 0x5a0a0 0x98e81
# 0xa229f runtime/pprof.writeRuntimeProfile+0xdf /usr/local/go/src/runtime/pprof/pprof.go:614
# 0xa1fbf runtime/pprof.writeGoroutine+0x9f /usr/local/go/src/runtime/pprof/pprof.go:576
# 0x9d63f runtime/pprof.(*Profile).WriteTo+0xff /usr/local/go/src/runtime/pprof/pprof.go:298
# 0x2017f main.main+0x17f /tmp/sandbox832735226/main.go:13
# 0x5a09f runtime.main+0x39f /usr/local/go/src/runtime/proc.go:183
Notice that runtime.main
at the bottom of the trace.
A program with two goroutines alive when the traces are dumped:
package main
import (
"log"
"os"
"runtime"
"runtime/pprof"
)
func main() {
c := make(chan int)
go func() { <-c }()
r := runtime.NumGoroutine()
log.Println("Num of goroutines: ", r)
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
}
Will produce something along the lines of:
2009/11/10 23:00:00 Num of goroutines: 2
goroutine profile: total 2
1 @ 0x20220 0x98f61
# 0x20220 main.main.func1+0x0 /tmp/sandbox584983760/main.go:12
1 @ 0xa2380 0xa20a0 0x9d720 0x201e0 0x5a180 0x98f61
# 0xa237f runtime/pprof.writeRuntimeProfile+0xdf /usr/local/go/src/runtime/pprof/pprof.go:614
# 0xa209f runtime/pprof.writeGoroutine+0x9f /usr/local/go/src/runtime/pprof/pprof.go:576
# 0x9d71f runtime/pprof.(*Profile).WriteTo+0xff /usr/local/go/src/runtime/pprof/pprof.go:298
# 0x201df main.main+0x1df /tmp/sandbox584983760/main.go:15
# 0x5a17f runtime.main+0x39f /usr/local/go/src/runtime/proc.go:183
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论