亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我使用 goroutine 進行 parral 的內存激增,最終 oom

我使用 goroutine 進行 parral 的內存激增,最終 oom

Go
料青山看我應如是 2022-05-18 15:31:53
我剛開始學圍棋。我正在嘗試進行總和計算。下面的代碼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 語句,以查看起始值和結束值是什么。


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號