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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么此Go代碼陷入僵局?

為什么此Go代碼陷入僵局?

Go
ibeautiful 2021-05-04 18:50:06
package mainimport "fmt"import "runtime"import "time"func check(id int) {    fmt.Println("Checked", id)    <-time.After(time.Duration(id)*time.Millisecond)    fmt.Println("Woke up", id)}func main() {    defer runtime.Goexit()    for i := 0; i <= 10; i++ {        fmt.Println("Called with", i)        go check(i)    }    fmt.Println("Done for")}我是Go的新手,所以任何指針都很棒。我將如何調(diào)試這樣的事情?您可以運(yùn)行代碼段http://play.golang.org/p/SCr8TZXQUE
查看完整描述

2 回答

?
米琪卡哇伊

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

從Goexit的文檔中:


Goexit終止調(diào)用它的goroutine。沒(méi)有其他goroutine受到影響。Goexit在終止goroutine之前運(yùn)行所有延遲的調(diào)用。


您正在退出主例程。別。當(dāng)您執(zhí)行此操作時(shí),在您啟動(dòng)的最后一個(gè)啟動(dòng)go check(i)完成之后,沒(méi)有任何例程在運(yùn)行,因此出現(xiàn)“死鎖”。只需刪除此行:


defer runtime.Goexit()

如果您要在main中等待一組goroutine完成,則可以使用sync.WaitGroup:


package main


import (

    "fmt"

    "sync"

    "time"

)


func check(id int, wg *sync.WaitGroup) {

    fmt.Println("Checked", id)

    <-time.After(time.Duration(id)*time.Millisecond)

    fmt.Println("Woke up", id)

    wg.Done()

}


func main() {

    var wg sync.WaitGroup

    for i := 0; i <= 10; i++ {

        wg.Add(1)

        fmt.Println("Called with", i)

        go check(i, &wg)

    }

    wg.Wait()

    fmt.Println("Done for")

}

編輯 :


如果您在golang的操場(chǎng)上進(jìn)行測(cè)試,則任何人time.After都將陷入僵局,因?yàn)闀r(shí)間在操場(chǎng)上被凍結(jié),Goexit可能退出標(biāo)準(zhǔn)程序中甚至不存在的例程。


查看完整回答
反對(duì) 回復(fù) 2021-05-17
?
斯蒂芬大帝

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

您的所有g(shù)oroutine都在等待某人消耗他們發(fā)送的值<-time.After。您只需刪除<-或使main消耗您啟動(dòng)的所有g(shù)oroutine的值即可。


編輯


這對(duì)我有用


package main


import "fmt"

//import "runtime"

import "time"



func check(id int) {

    fmt.Println("Checked", id)

    <-time.After(time.Duration(id)*time.Millisecond)

    fmt.Println("Woke up", id)

}


func main() {

    //defer runtime.Goexit()


    for i := 0; i <= 10; i++ {

        fmt.Println("Called with", i)

        go check(i)

    }


    fmt.Println("Done for")

}

女巫與某人之前提出的解決方案相同,所以我將在沒(méi)有等待組的情況下提出解決方案


package main


import "fmt"

import "time"



func check(id int, c chan bool) {

    fmt.Println("Checked", id)

    time.After(time.Duration(id)*time.Millisecond)

    fmt.Println("Woke up", id)

    c <- true

}


func main() {

    c := make(chan bool)


    for i := 0; i <= 10; i++ {

        fmt.Println("Called with", i)

        go check(i, c)

    }

    var n uint

    for n<10 {

        <- c

        n++

    }

    fmt.Println("Done for")

}


查看完整回答
反對(duì) 回復(fù) 2021-05-17
  • 2 回答
  • 0 關(guān)注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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