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

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

為什么此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的新手,所以任何指針都很棒。我將如何調試這樣的事情?您可以運行代碼段http://play.golang.org/p/SCr8TZXQUE
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

從Goexit的文檔中:


Goexit終止調用它的goroutine。沒有其他goroutine受到影響。Goexit在終止goroutine之前運行所有延遲的調用。


您正在退出主例程。別。當您執(zhí)行此操作時,在您啟動的最后一個啟動go check(i)完成之后,沒有任何例程在運行,因此出現(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的操場上進行測試,則任何人time.After都將陷入僵局,因為時間在操場上被凍結,Goexit可能退出標準程序中甚至不存在的例程。


查看完整回答
反對 回復 2021-05-17
?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

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


編輯


這對我有用


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")

}

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


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")

}


查看完整回答
反對 回復 2021-05-17
  • 2 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號