GOVERSION=go1.18.1不调用done()也可以跑
来源:11-2 使用Channel等待任务结束
慕UI4297113
2022-05-16
我今天用1.18.1版本,不调用Done也可以跑完,这个是新版的改动原因吗?
// 输出调用chan接收到的参数
func doWorker(id int, w Worker) {
for true {
fmt.Printf("Worker %d received: %c\n", id, <-w.in)
//w.done()
}
}
type Worker struct {
in chan int
done func()
}
// 创建好goroutine的并发方法,初始化Worker类的参数
func createWorker(id int, wg *sync.WaitGroup) Worker {
w := Worker{
in: make(chan int),
done: func() {
// 每一个完成后done一次
wg.Done()
},
}
go doWorker(id, w)
return w
}
func main() {
var works [10]Worker
wg := sync.WaitGroup{}
wg.Add(20)
for i := 0; i < 10; i++ {
works[i] = createWorker(i, &wg)
}
for i, work := range works {
work.in <- 'a' + i
}
for i := 0; i < 10; i++ {
works[i].in <- 'A' + i
}
}
写回答
1回答
-
ccmouse
2022-05-18
这个跟go的版本没有关系。同学可以多跑几次试试,我试了一下每次跑打印出来的行数是不一样的。
这个是预料中的,没有了done/wait的调用,main什么时候退出和打印动作的完成之间就没有同步,输出结果就会具有不确定性。(即使在你的机器上能每次都输出20行,它还是不具有确定性)
00
相似问题