为了账号安全,请及时绑定邮箱和手机立即绑定

通道切片和并发函数执行

通道切片和并发函数执行

Go
慕勒3428872 2021-09-10 17:24:54
如何double(i)在切片迭代中同时创建通道切片和运行函数:package mainimport (    "fmt"    "time")func double(i int) int {    result := 2 * i    fmt.Println(result)    time.Sleep(500000000)    return result}func notParallel(arr []int) (outArr []int) {    for _, i := range arr {        outArr = append(outArr, double(i))    }    return}// how to do the same as notParallel func in parallel way.// For each element of array double func should evaluate concuruntly// without waiting each next element to evalfunc parallel(arr []int) (outArr []int) {    var chans []chan int    for i := 0; i < len(arr); i++ {        chans[i] = make(chan int) // i = 0 : panic: runtime error: index out of range    }    for counter, number := range arr {        go func() {            chans[counter] <- double(number)        }()    }    return}func main() {    arr := []int{7, 8, 9}    fmt.Printf("%d\n", notParallel(arr))    fmt.Printf("%d\n", parallel(arr))}操场由于函数double(i)休眠 500 毫秒,函数notParallel(arr []int)对 3 个元素的工作时间为 1500 毫秒,arr []int但函数parallel(arr []int)将工作约 500 毫秒。在我的实现中有错误...panic: runtime error: index out of range... 在线的 ...chans[i] = make(chan int) // i = 0
查看完整描述

1 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

在这种情况下,您不需要使用 chan。


package main


import (

    "fmt"

    "sync"

    "time"

)


func double(i int) int {

    result := 2 * i

    fmt.Println(result)

    time.Sleep(500000000)

    return result

}


func notParallel(arr []int) (outArr []int) {

    for _, i := range arr {

        outArr = append(outArr, double(i))

    }

    return

}


// how to do the same as notParallel func in parallel way.

// For each element of array double func should evaluate concuruntly

// without waiting each next element to eval

func parallel(arr []int) (outArr []int) {

    outArr = make([]int, len(arr))

    var wg sync.WaitGroup

    for counter, number := range arr {

        wg.Add(1)

        go func(counter int, number int) {

            outArr[counter] = double(number)

            wg.Done()

        }(counter, number)

    }

    wg.Wait()


    return

}


func main() {

    arr := []int{7, 8, 9}

    fmt.Printf("%d\n", notParallel(arr))

    fmt.Printf("%d\n", parallel(arr))

}

因为并行必须等待 goroutine(s) 的所有完成。


而且我注意到您的代码不工作,因为你是指counter,number在同样的功能范围。


查看完整回答
反对 回复 2021-09-10
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信