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行,它还是不具有确定性)

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程