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)程序中甚至不存在的例程。

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")
}
- 2 回答
- 0 關(guān)注
- 201 瀏覽
添加回答
舉報(bào)