【问题标题】:golang pipelining channels - works as a separate function, but doesn't work as a part of main functiongolang 流水线通道 - 作为一个单独的函数工作,但不能作为 main 函数的一部分工作
【发布时间】:2017-06-03 18:31:28
【问题描述】:

我是新手,目前我正在尝试了解频道同步的工作原理。我正在解决一个需要我从通道构建管道的测试任务。我写了两个类似的解决方案,但其中一个由于未知原因(对我而言)不起作用。

这不起作用(go-routines 直接从函数启动):

https://play.golang.org/p/EHceKjZZ-G

这行得通(go-routines 从一个单独的函数开始):

https://play.golang.org/p/QysTAVxbVc

我完全迷失了,我看不出区别,也无法理解为什么第一个示例不起作用。有人知道吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    您在goroutine 中使用了一个捕获变量fn,其中该变量将在迭代期间被覆盖。所有goroutines 看到的是funcs 的最新工作。将 Pipe 函数中的代码更改为以下内容:

    for _, fn := range funcs {
        out = make(chan interface{})
        wg.Add(1)
        go func(f job, inx, outx chan interface{}) {
            f(inx, outx)
            close(outx)
            wg.Done()
        }(fn, in, out)
    
        in = out
    }
    

    它是 golang 中的 common mistake 之一。

    【讨论】:

    • 你完全正确!我试图用 in 和 out 来避免它,但是用 fn 错过了它!非常感谢,因为这个我睡不着! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多