<- worker.done 两次的意思是什么?

来源:11-2 使用Channel等待任务结束

HuberyYoung

2020-12-24

package main

import (
	"fmt"
)

type work struct {
	in   chan int
	done chan bool
}

func doWorker(id int, w work) {
	for n := range w.in {
		fmt.Printf("createWorker %d  received %c\n", id, n)
		go func() {
			w.done <- true
		}()
	}
}

func createWorker(id int) work {
	w := work{
		in:   make(chan int),
		done: make(chan bool),
	}
	go doWorker(id, w)
	return w
}

func chanDemo() {
	var works [10]work
	for i := 0; i < 10; i++ {
		works[i] = createWorker(i)
	}

	for i := 0; i < 10; i++ {
		works[i].in <- 'a' + i
	}

	for i := 0; i < 10; i++ {
		works[i].in <- 'A' + i
	}

	// 第一次执行
	for _, worker := range works {
		<-worker.done
		<-worker.done
	}

	//// 第二次执行
	//for _, worker := range works {
	//	<-worker.done
	//}
}
func main() {
	chanDemo()
}

如上代码,为什么for range 的时候要用两次<- worker.done?我两次执行都没有报错,只不过打印出来的值要少一些

写回答

1回答

俱乐部恶霸

2020-12-24

for i := 0; i < 10; i++ {
works[i].in <- 'a' + i
}

for i := 0; i < 10; i++ {
works[i].in <- 'A' + i
}

上面往channel写了20次

for _, worker := range works {
<-worker.done
<-worker.done
}

range workes只循环10次,所以执行两次<-worker.done才能把channel读完


0
0

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

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

5995 学习 · 1909 问题

查看课程