请教个goroutine泄漏的问题

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

> 初学golang,比着圣经照猫画虎...有一事不明,请教大家 第八章第五节有几个生成缩略图的方法 其中 makethumb4 如下: func makeThumbnails4(filenames []string) error { // 创建一个error类型的channel errors := make(chan error) for _, f := range filenames { go func(f string) { _, err := thumbnail.ImageFile(f) errors <- err // 把 err信息写入到错误通道中,正常会写进一个nil去 }(f) } // 从error通道中读取 for range filenames { if err := <-errors; err != nil { return err // !!!错误操作,过早的return操作会导致goroutine泄露... } } return nil } 上文已经写明了 __过早return操作会导致goroutine泄漏__。 然后作者给出了一个基于缓冲通道来解决此问题的方法,就是 makethumb5: func makeThumbnails5(filenames []string) (thumbfiles []string, err error) { // 定义一个结构体, type item struct { thumbfile string err error } ch := make(chan item, len(filenames)) // 开始使用worker goroutine生成缩略图 for _, f := range filenames { go func(f string) { var ita item ita.thumbfile, ita.err = thumbnail.ImageFile(f) ch <- ita }(f) } // 开始收集通道信息 for range filenames { // 从通道中取值,该通道是缓冲通道 ita := <-ch if ita.err != nil { fmt.Printf("出错了:%v", ita.err) return nil, ita.err } thumbfiles = append(thumbfiles, ita.thumbfile) } return thumbfiles, nil } 关于这个方法我怎么感觉也有可能造成goroutine泄漏呢? 假如第二个for循环第一个迭代就发生err然后return了,这时候主goroutine就结束了,ch通道也消失了,_那么是否存在一种可能就是工作goroutine这时候还没有被塞满呢_,如果真的存在这种情况那么那几个还没有返回的goroutine往ch里发送内容就会阻塞,不一样会导致泄漏吗? 小弟愚钝,望不吝赐教

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

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

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