我剛開始學圍棋。我正在嘗試進行總和計算。下面的代碼func test() { start := time.Now() ret := make(chan int) go foo(1, 100000, ret) ssum := <- ret elap := time.Since(start) fmt.Println(ssum) fmt.Printf("used time in milli is %d", elap)}func foo(start, end int, ret chan int) { if start > end { ret <- 0 return } if end - start <= 10000 { sum := 0 for i := start; i <=end; i++ { sum += i } ret <- sum return } mid := (end - start) / 2 leftRet := make(chan int) go foo(start, mid, leftRet) leftNum := <- leftRet rightRet := make(chan int) go foo(mid+1, end, rightRet) rightNum := <- rightRet ret <- leftNum + rightNum}上面的代碼做并行計算嗎?由于 goroutine 不是多進程,甚至不是多線程。我不確定 goroutine 是否可以用來做 parrell 計算。為什么我會出現內存激增和 oom?
1 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
這不是并行執行任何操作。您創建一個 goroutine,然后立即等待它的返回值,每個 goroutine 執行計算,將結果寫入通道并返回。所以那里沒有并行性。如果在所有 goroutine 創建后將通道讀取移動到該行,您可能會得到一些并發執行,因此兩個 goroutine 可以運行。
您的程序不正確,這就是它沒有終止的原因。mid
不是(end-start)/2
,是(end+start)/2
。它很可能會陷入end-start
大于 10000的情況,并且mid
您最終會一遍又一遍地運行相同的開始值和結束值。在中間計算之后放置一個 println 語句,以查看起始值和結束值是什么。
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消