To nie są nici, oni goroutines, a liczba ta może się różnić w zależności od bieżącej realizacji (tj w go1.2 byłoby drukowane 2).
Teraz wygląda na to, że masz 1 dla main
i 3 dla środowiska wykonawczego/gc.
import "fmt"
func main() {
fmt.Println(func() string { panic(nil); return "" }())
}
To pokazuje
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
jeśli usunąć FMT oraz korzystać z funkcji ładowania print
masz tylko 2 goroutines.
import "runtime"
func main() {
print(runtime.NumGoroutine(), "\n")
}
// prints 2
Jeśli kiedykolwiek chcą wiedzieć dokładnie co goroutines są uruchomione, wydrukować ślad stosu, zadzwoń panikę, albo zabić proces z SIGQUIT (która drukuje ślad stosu i kończy). Jeśli prowadzisz absolutną programu minimalnego można uzyskać ślad stosu z możesz zobaczyć 2 goroutines:
package main
func main() {
panic(nil)
}
Goroutines są bardzo tanie, a wiele rzeczy uruchomić i zatrzymać kolejne goroutines, więc starają się śledzić ich dolna granica nie jest zbyt użyteczna. Zauważ, że pomimo tego, że istnieją tylko 2 goroutiny (główny/runtime.php i runtime.MHeap_Scavenger), liczba ta jest już większa niż 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