请教个goroutine泄漏的问题

chuanjinge · 2018-04-01 09:47:01 · 1340 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-01 09:47:01 的主题,其中的信息可能已经有所发展或是发生改变。

初学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

1340 次点击  
加入收藏 微博
4 回复  |  直到 2018-04-05 11:12:06
dipperkun
dipperkun · #1 · 7年之前

main goroutine结束了,整个进程也就终止了,不存在泄露问题了

xyhqyq
xyhqyq · #2 · 7年之前

goroutine泄露指的是没有receive操作导致send端一直阻塞,使得channel无法被gc的现象

lttto
lttto · #3 · 7年之前

应为使用的是个与文件个数相同的通道组,每个goroutine都会有一个对应的通道,不需要等待通道的释放;所以不会导致程序陷入卡顿

chuanjinge
chuanjinge · #4 · 7年之前
ltttolttto #3 回复

应为使用的是个与文件个数相同的通道组,每个goroutine都会有一个对应的通道,不需要等待通道的释放;所以不会导致程序陷入卡顿

多谢哈。还是不太明白哈,“每个goroutine都会有一个对应的通道” -- 但是程序里明明只有一个通道ch啊,所有的goroutine都是往这一个通道里send数据啊. 我的担心就是万一有些工作goroutine还没来得及往通道里send东西呢,主goroutine就因为某个错误给return了,这样那些工作goroutine再想send也找不到了,这可咋办。。。

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