1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | package main import ( "fmt" "time" ) func main() { Demo() } func worker(id int, c chan int) { for { fmt.Println( "ha??" ) fmt.Printf( "worker %d received %d \n" , id, <-c) fmt.Println( "ha!!" ) } } func Demo() { c := make(chan int, 3) c <- 1 c <- 2 c <- 3 for i := 0; i < 10; i++ { go worker(i, c) } time.Sleep(time.Millisecond) } |
请问,worker函数里为什么要写for死循环来执行打印?外面起了10个携程,去掉for死循环结果也是一样的吧?
如果用死循环,生成无限个channel阻塞(<-c) 是不是也损耗资源呢?
还有我的理解顺序是否正确:worker里面的打印会先阻塞掉,等待channel写入。当c<-1,c<-2,c<-3,有写入的时候,上面阻塞掉的携程被唤醒,执行打印。
麻烦老师给与讲解。多谢