第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通道切片和并發(fā)函數(shù)執(zhí)行

通道切片和并發(fā)函數(shù)執(zhí)行

Go
慕勒3428872 2021-09-10 17:24:54
如何double(i)在切片迭代中同時創(chuàng)建通道切片和運行函數(shù):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))}操場由于函數(shù)double(i)休眠 500 毫秒,函數(shù)notParallel(arr []int)對 3 個元素的工作時間為 1500 毫秒,arr []int但函數(shù)parallel(arr []int)將工作約 500 毫秒。在我的實現(xiàn)中有錯誤...panic: runtime error: index out of range... 在線的 ...chans[i] = make(chan int) // i = 0
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻1801條經(jīng)驗 獲得超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 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號