gpt4 book ai didi

go - 我使用 goroutine 进行 parral 的内存激增,最终 oom

转载 作者:行者123 更新时间:2023-12-01 22:40:37 24 4
gpt4 key购买 nike

我刚开始学围棋。我正在尝试进行总和计算。下面的代码

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?
  • 最佳答案

    这不是并行执行任何操作。您创建一个 goroutine,然后立即等待它的返回值,每个 goroutine 执行计算,将结果写入 channel 并返回。所以那里没有并行性。如果在所有 goroutine 创建后将 channel 读取移动到该行,您可能会得到一些并发执行,因此两个 goroutine 可以运行。

    您的程序不正确,这就是它没有终止的原因。 mid不是 (end-start)/2 , 是 (end+start)/2 .很可能会陷入 end-start 的情况。大于 10000 和 mid是这样的,你最终会一遍又一遍地运行相同的开始和结束值。在中间计算之后放置一个 println 语句,以查看起始值和结束值是什么。

    关于go - 我使用 goroutine 进行 parral 的内存激增,最终 oom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60426114/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com