簡體   English   中英

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

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

Go似乎總是在任何給定時間運行至少4個goroutines。 還有哪三個不是主要的goroutine?

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

package main

import (
    "fmt"
    "runtime"
)

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

那些不是線程,它們是goroutines,並且數量可能根據當前的實現而變化(即在go1.2中它將打印2)。

現在,看起來你有1個用於main ,3個用於runtime / gc。

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,並使用bootstrapping print功能,你只能獲得2個goroutines。

import "runtime"

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

// prints 2

如果你想知道goroutine正在運行什么,打印堆棧跟蹤,調用恐慌,或使用SIGQUIT(打印堆棧跟蹤並退出)終止進程。 如果您運行絕對最小程序,您可以從中獲得堆棧跟蹤,您可以看到2個goroutines:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM