通道切片和并发函数执行



如何在切片迭代中同时创建通道切片并double(i)运行函数:

package main
import (
    "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 eval
func 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("%dn", notParallel(arr))
    fmt.Printf("%dn", parallel(arr))
}

操场

由于函数double(i)休眠 500 毫秒,函数notParallel(arr []int) 3 个arr []int元素的 1500 毫秒,但函数 parallel(arr []int) 将工作约 500 毫秒。

在我的实现中有错误...

panic: runtime error: index out of range

。在线。。。

chans[i] = make(chan int) // i = 0

在这种情况下,您不需要使用 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("%dn", notParallel(arr))
    fmt.Printf("%dn", parallel(arr))
}

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

而且我注意到您的代码不起作用,因为您在相同的函数范围内引用counternumber

最新更新