Я получил всплеск памяти, используя Goroutine для Parral, в конце концов OOM - PullRequest
0 голосов
/ 27 февраля 2020

Я только начал учиться go. Я пытаюсь сделать подсчет суммы в go. Код ниже

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
}
  1. Имеет ли код выше параллельные вычисления? Так как горутины не являются многократным процессом, нет даже нескольких потоков. Я не уверен, можно ли использовать goroutine для вычислений Паррелла.

  2. Почему у меня всплеск памяти и ом?

1 Ответ

1 голос
/ 27 февраля 2020

Это ничего не делает параллельно. Вы создаете программу и сразу ждете ее возвращаемого значения, где каждая программа выполняет вычисления, записывает результат в канал и возвращает. Так что здесь нет параллелизма. Вы можете получить некоторое одновременное выполнение, если переместите чтения канала в строку после создания всех подпрограмм, чтобы могли выполняться две подпрограммы.

Ваша программа неверна, и поэтому она не завершается. mid это не (end-start)/2, это (end+start)/2. Вполне вероятно, что это относится к случаю, когда end-start больше 10000, а mid таков, что вы в конечном итоге запускаете одни и те же начальные и конечные значения снова и снова. Поместите оператор println после этого среднего вычисления, чтобы увидеть начальные и конечные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...