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

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

與 for 循環(huán)和匿名函數(shù)的并發(fā)行為異常

與 for 循環(huán)和匿名函數(shù)的并發(fā)行為異常

Go
料青山看我應(yīng)如是 2022-01-04 21:21:19
我已經(jīng)找到了一種讓代碼按照我想要的方式運(yùn)行的方法,但我想了解它為什么會這樣,以便我對 Go 并發(fā)性的理解有所提高。我正在測試sync.WaitGroup等待一些 goroutine 完成,因為我計劃以這種方式多次上傳到 Amazon S3。這是我最初的代碼:func main() {    var wg sync.WaitGroup    for i := 1; i <= 5; i++ {        wg.Add(1)        go func() {            fmt.Println(i)            time.Sleep(time.Second * 1)            wg.Done()        }()    }    wg.Wait()}我很驚訝地看到輸出是:6, 6, 6, 6, 6。而不是像:2, 4, 1, 5, 3。由于循環(huán)甚至沒有達(dá)到 6,這對我來說毫無意義。后來我將該i變量作為參數(shù)傳遞給匿名函數(shù),然后它的行為符合我的預(yù)期。為什么會發(fā)生這種情況?我不明白。
查看完整描述

2 回答

?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗 獲得超8個贊

在這種情況下,在 for 循環(huán)完成之前,不會調(diào)度任何 goroutine。為了使 for 循環(huán)中斷,i必須不小于或等于 5,因此在該點(diǎn)為 6。當(dāng) goroutine 運(yùn)行時,它們每個都會打印i在閉包中捕獲的單個變量的值。

當(dāng)您將i參數(shù)作為參數(shù)傳遞給函數(shù)時,您將當(dāng)前值復(fù)制到一個新變量中,并捕獲當(dāng)時的值。


查看完整回答
反對 回復(fù) 2022-01-04
?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗 獲得超6個贊

要回答您的問題,您必須傳入i您的,func以便每個例程都有自己的i.


所以你的代碼應(yīng)該是這樣的


func main() {

    var wg sync.WaitGroup


    for i := 1; i <= 5; i++ {

        wg.Add(1)

        go func(i int) {

            fmt.Println(i)

            time.Sleep(time.Second * 1)

            wg.Done()

        }(i)

    }


    wg.Wait()

}

我編寫了這個實(shí)用程序函數(shù)來幫助并行化一組函數(shù):


import "sync"


// Parallelize parallelizes the function calls

func Parallelize(functions ...func()) {

    var waitGroup sync.WaitGroup

    waitGroup.Add(len(functions))


    defer waitGroup.Wait()


    for _, function := range functions {

        go func(copy func()) {

            defer waitGroup.Done()

            copy()

        }(function)

    }

}

所以在你的情況下,我們可以這樣做


func main() {

    functions := []func(){}

    for i := 1; i <= 5; i++ {

            function := func(i int) func() {

                return func() {

                        fmt.Println(i)

                }

            }(i)


        functions = append(functions, function)

    }


    Parallelize(functions...)


    fmt.Println("Done")

}

如果你想使用 Parallelize 功能,你可以在這里找到它https://github.com/shomali11/util


查看完整回答
反對 回復(fù) 2022-01-04
  • 2 回答
  • 0 關(guān)注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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