2017-10-12 1 views
0

Für den folgenden Code:Goroutine Größe in Golang steigt nicht linear

const LOOPNUM int = 200000 

func main() { 
    z := make(chan int16) 
    for i := 0; i < LOOPNUM; i++ { 
     go test(z) 
    } 
} 

func test(a chan<- int16) { 
    a <- -1 
} 

ich den Code lief mit LOOPNUM = 200k und 400k und die Speichernutzung ist wie folgt aus:

goroutine size comparison

Kennt jemand den Grund der plötzlichen Speicherzunahme, nachdem ich meine goroutines verdoppelte (und irgendeine Lösung, um Speicherverbrauch zu reduzieren)?

Danke!

+0

Welchen Messwert verwenden Sie, um Ihr Gedächtnis zu messen? Drucken Sie die relevanten Speicherstatistiken aus der go-Laufzeit, die genau angeben, was zugewiesen wurde. – JimB

Antwort

0

Du wartest nicht darauf, dass die Goroutines zu Ende gehen, also ist es spannend, bevor es etwas ändern kann, um alles zu tun, was du sagst. Ändern Sie es zu diesem:

const LOOPNUM int = 200000 
var wg sync.WaitGroup 
func main() { 
    wg = sync.WaitGroup{} 
    wg.Add(LOOPNUM) 
    z := make(chan int16) 
    for i := 0; i < LOOPNUM; i++ { 
     go test(z) 
    } 
    wg.Wait() 
} 

func test(a chan<- int16) { 
    a <- -1 
    wg.Done() 
} 

Und Sie sollten eine bessere Idee von dem bekommen, was passiert.

+0

der obige Code funktioniert irgendwie nicht: fataler Fehler: alle goroutines sind eingeschlafen - Deadlock! – Kyle

+1

@Kyle: Du liest nie aus dem Kanal. Also natürlich ist alles hängen geblieben. –

+0

könnten Sie einen Hinweis auf die Ursache der großen Speicherauslastung geben? Ich habe deinen Code ausgeführt und er verhält sich genauso wie meiner ... Danke – Kyle

Verwandte Themen