2014-09-09 13 views

Odpowiedz

8

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 
Powiązane problemy