登录
首页 >  Golang >  Go问答

在 golang 中利用 go 例程并行计算最大值

来源:stackoverflow

时间:2024-02-10 23:39:25 174浏览 收藏

一分耕耘,一分收获!既然都打开这篇《在 golang 中利用 go 例程并行计算最大值》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我正在尝试理解并发和并行性。我需要使用 go 例程、通道等待组计算数组的最大值,并将其存储在共享变量中,下面的代码出现死锁,请给出指示

package main

import (
    "fmt"
    "math"
)

func main() {
    arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    max := math.MinInt32
    ch := make(chan int)
    for i := 0; i < len(arr); i++ {
        go func(i int) {
            ch <- arr[i]
        }(i)
    }
    for i := 0; i < len(arr); i++ {
        if max < <-ch {
            max = <-ch
        }
    }
    fmt.Println(max)
}

正确答案


第二个循环期望从 ch 接收 len(arr)*2 值。而 len(arr) 值全部发送到 ch
并将返回从通道读取的下一个值,但不是最大元素。

// reading from channel twice.
if max < <-ch {
// this is next value after max not max
    max = <-ch
}

将第二个循环更改为

for i := 0; i < len(arr); i++ {
  got := <-ch
    if max < got {
      max = got
    }
}

建议:这不是并行计算最大值。此处连续读取通道并将值与最大值进行比较,就像在切片本身上进行范围一样。

您可以改为实现基于 dac 的方法来查找 go 例程中最多 2 个元素,然后合并结果,以找到最终的最大值。这将使您更好地了解通道和程序间通信

每次调用 <- ch 时,您都会从通道中读取一个新值。这意味着您的代码

        if max < <-ch {
            max = <-ch
        }

没有达到您的预期。

如果您的频道输入了值 12...,那么您的代码将按如下方式工作:

        if max < <-ch { // reads value `1`, compares it against `max`
            max = <-ch  // reads the value `2`, then assigns it to `max`
        }

这导致死锁的原因是,您从通道读取的值是写入通道的两倍,因为每次循环时,您都试图读取两个值。

要同时解决这两个问题,请使用临时变量:

    for i := 0; i < len(arr); i++ {
        if value := <-ch; max < value {
            max = value
        }
    }

终于介绍完啦!小伙伴们,这篇关于《在 golang 中利用 go 例程并行计算最大值》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>