登录
首页 >  Golang >  Go问答

示例 Goroutine - 解释 Donovan/Kernighan 书籍

来源:stackoverflow

时间:2024-02-18 14:33:21 134浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《示例 Goroutine - 解释 Donovan/Kernighan 书籍》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

以下示例摘自 donovan/kernighan 的书:

func makeThumbnails6(filenames <-chan string) int64 {
    sizes := make(chan int64)
    var wg sync.WaitGroup // number of working goroutines
    for f := range filenames {
        wg.Add(1)
        // worker
        go func(f string) {
            defer wg.Done()
            thumb, err := thumbnail.ImageFile(f)
            if err != nil {
                log.Println(err)
                return
            }
            info, _ := os.Stat(thumb) // OK to ignore error
            sizes <- info.Size()
        }(f)
    }
    // closer
    go func() {
        wg.Wait()
        close(sizes)
    }()
    var total int64
    for size := range sizes {
        total += size
    }
    return total
}

书中指出:

“等待和关闭这两个操作必须与 循环大小。考虑替代方案:如果等待操作是 放在循环之前的主协程中,它永远不会结束”

这是我不明白的 - 如果它们没有放在单独的 goroutine 中,那么 wg.wait 将阻塞主 goroutine,所以当所有其他 goroutine 完成时, close(sizes) 将会发生。关闭尺寸通道仍然允许循环读取所有已发送的消息/从通道,对吗?


解决方案


是的,但这不是问题。所有 goroutine 都在等待从通道读取(因此,没有人会向它们写入数据)。因此,如果 sizes 未缓冲,则进程将死锁。为了让工作人员完成,需要从中读取一些内容。要使 wg.Wait() 完成,工作人员需要完成。

而且,range size 无法完成(例如,找到一个空的、关闭的通道),直到 close(sizes) 发生,这在工作人员完成之前无法完成(因为它们是写入 size 的人) .

所以 wg.Wait()close(sizes) 都必须在同时发生的 rangesized 之前完成。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>