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

sayac · · 712 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

``` func main() { worklist := make(chan []string) // lists of URLs, may have duplicates unseenLinks := make(chan string) // de-duplicated URLs // Add command-line arguments to worklist. go func() { worklist <- os.Args[1:] }() // Create 20 crawler goroutines to fetch each unseen link. for i := 0; i < 20; i++ { go func() { for link := range unseenLinks { foundLinks := crawl(link) go func() { worklist <- foundLinks }() } }() } // The main goroutine de-duplicates worklist items // and sends the unseen ones to the crawlers. seen := make(map[string]bool) for list := range worklist { for _, link := range list { if !seen[link] { seen[link] = true unseenLinks <- link } } } } ``` 主要问题:**书中源代码如上所示,求问第13行代码,`go func(){worklisk <- foundLinks}()`,书中说非得要这个才能避免死锁,为甚么一定要新开一个goroutine才能避免?直接 `worklist <- foundlinks`,不新创goroutine我跑了,没有报dead lock, 但是运行的速度变慢了,** 我自己思路如下,像上面的代码, 创建20个协程和创建1个携程在死锁的问题上没影响 抽出来代码的结构就是有两个通道, ch1, ch2。 两个类型的goroutine, gorou1, gorou2, 一个goroutine从一个channel 取值发送到另外一个, 可以理解为gorou1从ch1接收值,再发送到ch2。gorou2从ch2拿值,发送到ch1, 如下, 这种方式不需要在往ch2发送值时,添加一个协程来避免死锁, 能直接跑通 ```go func main(){ ch1 := make(chan int) ch2 := make(chan int) go func(){ ch1 <- 1 }() go func() { for x:= range ch1 { ch2 <- x fmt.Println("ch1") } }() for x:= range ch2 { ch1 <-x fmt.Println("ch2", c) } } ``` 是我哪里的理解有问题?

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

712 次点击  
加入收藏 微博
1 回复  |  直到 2021-01-22 16:16:33
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传