栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

goroutine的订购结果

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

goroutine的订购结果

Goroutines独立地并行运行,因此,如果没有显式同步,您将无法预测执行和完成顺序。因此,您无法将返回的数字与输入的数字配对。

您可以返回更多数据(例如,输入数字和输出,例如包装在结构中),也可以将指针传递到辅助函数(作为新的goroutine发布),例如

*Stuff
,让goroutine自己填充计算出的数据
Stuff

返回更多数据

我将使用的信道类型

chan Pair
,其中
Pair
是:

type Pair struct{ Number, Result int }

因此计算将如下所示:

func doubleNumber(i int, c chan Pair) { c <- Pair{i, i + i} }func powerNumber(i int, c chan Pair) { c <- Pair{i, i * i} }

我将使用a,

map[int]*Stuff
因为可收集的数据来自多个渠道(
double
power
),并且我想
Stuff
轻松快捷地找到合适的数据(需要指针,因此我也可以在“地图”中对其进行修改)。

所以主要功能:

nums := []int{2, 3, 4} // given numbersstuffs := map[int]*Stuff{}double := make(chan Pair)power := make(chan Pair)for _, i := range nums {    go doubleNumber(i, double)    go powerNumber(i, power)}// How do I get the values back in the right order?for i := 0; i < len(nums)*2; i++ {    getStuff := func(number int) *Stuff {        s := stuffs[number]        if s == nil { s = &Stuff{Number: number} stuffs[number] = s        }        return s    }    select {    case p := <-double:        getStuff(p.Number).Double = p.Result    case p := <-power:        getStuff(p.Number).Power = p.Result    }}for _, v := range nums {    fmt.Printf("%+vn", stuffs[v])}

输出(在Go Playground上尝试):

&{Number:2 Double:4 Power:4}&{Number:3 Double:6 Power:9}&{Number:4 Double:8 Power:16}

使用指针

从现在开始我们传递

*Stuff
值,我们可以在
Stuff
自身中“预填充”输入数字。

但是必须小心,您只能在正确同步的情况下读取/写入值。最简单的方法是等待所有“工人” goroutine完成工作。

var wg = &sync.WaitGroup{}func main() {    nums := []int{2, 3, 4} // given numbers    stuffs := make([]Stuff, len(nums))    for i, n := range nums {        stuffs[i].Number = n        wg.Add(2)        go doubleNumber(&stuffs[i])        go powerNumber(&stuffs[i])    }    wg.Wait()    fmt.Printf("%+v", stuffs)}func doubleNumber(s *Stuff) {    defer wg.Done()    s.Double = s.Number + s.Number}func powerNumber(s *Stuff) {    defer wg.Done()    s.Power = s.Number * s.Number}

输出(在Go Playground上尝试):

[{Number:2 Double:4 Power:4} {Number:3 Double:6 Power:9} {Number:4 Double:8 Power:16}]


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号