2017-10-12 77 views
0

對於以下的代碼:夠程大小中Golang不增加而線性

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 
} 

我跑與LOOPNUM = 200K和400K的代碼,並且存儲器使用情況是這樣的:

goroutine size comparison

有沒有人知道在我的goroutines加倍(以及減少內存使用的任何解決方案)後突然記憶增加的原因?

謝謝!

+0

你用什麼度量來衡量你的記憶力?從go運行時打印相關的內存統計信息,該內存統計信息將準確指示已分配的內容。 – JimB

回答

0

你並不是等待goroutines完成,所以在它做出改變以完成你所做的每件事之前它就會退出。將其更改爲:

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() 
} 

而且您應該對所發生的事情有更好的瞭解。

+0

上面的代碼莫名其妙地不工作:致命錯誤:所有goroutines都睡着了 - 死鎖! – Kyle

+1

@凱爾:你從來沒有讀過這個頻道。所以當然一​​切都卡住了。 –

+0

你能否提供一些關於大內存使用情況的提示?我運行了你的代碼,它的行爲和我的一樣...謝謝 – Kyle