> 初学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里发送内容就会阻塞,不一样会导致泄漏吗?
小弟愚钝,望不吝赐教
更多评论