求问《go语言程序设计》例子,并发爬虫例3,gopl.io/ch8/crawl3,goroutine与channel同用,避免死锁问题

sayac · · 712 次点击
可以看下最近的go周刊里面的题目:https://studygolang.com/topics/12982 原因:假设我们在main goroutine里启动一个子goroutine叫b,那么实际上在main goroutine里发生的事情是这样的: 1.main goroutine执行到go语句 2.go语句发现后面的函数表达式需要传递参数 3.于是被传递的参数在main goroutine里求值 4.新的goroutine b被创建,刚求值的参数传递给需要执行的函数(假设叫f),f在goroutine b中开始执行 5.go语句结束,控制流程回到main goroutine 所以go fmt.Println(<-ch1)里的chan接收操作是在main goroutine里执行的,因此死锁是板上钉钉的事情。如果改成go func() {fmt.Println(<-ch1)}就没问题了
#1