【发布时间】:2019-09-25 13:20:32
【问题描述】:
我正在尝试使用 go 例程来确定谁首先收到消息。然而,当主 goroutine 终止时,一些 goroutine 仍然挂起。我通过panic 的堆栈跟踪看到了这一点。但是,如果我添加time.Sleep,它们都会终止。我猜这是因为,当主要的 go 例程结束时,Go 运行时找不到时间来终止其他的。
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 1000000; i++ {
algo()
}
// without this, some goroutines do not terminate
// time.Sleep(time.Second)
panic("")
}
func algo() {
c := make(chan int)
wait := make(chan bool)
go racer(1, wait, c)
go racer(2, wait, c)
go racer(3, wait, c)
go racer(4, wait, c)
go racer(5, wait, c)
// who gets it first
c <- 5
close(wait)
}
func racer(name int, wait chan bool, c chan int) {
select {
case <-wait:
case v := <-c:
fmt.Println(name, ":", v)
}
}
【问题讨论】:
标签: go concurrency