如何在管道中同步 goroutine

我需要帮助来理解为什么以下代码不起作用。我正在构建一个管道并尝试执行一个步骤来同步来自两个源通道的值。我的源代码/生成器代码如下所示(在我的真实代码中,我从文件中读取文本)。来源已排序,但不能保证值在两个来源中。


func Source() <-chan int{

    out := make(chan int, 5)


    go func() {

        defer reader.Close()


        out <- 1

        out <- 2

        out <- 3

        out <- 4

        out <- 5

        out <- 7


        close(out)

    }()


    return out

}

同步代码如下所示:


func Sync(a, b <-chan int) <-chan int {

    out := make(chan int)


    go func() {

        av, ak:= <-a

        bv, bk:= <-b


        for ak || bk {


            if !ak || av < bv {

                out <- bv


                bv, bk = <-b

                continue

            }


            if !bk|| bv > av {

                out <- av


                av, ak = <-a

                continue

            }


            out <- av


            av, ak = <-a

            bv, bk = <-b

        }


        close(out)

    }()


    return out

}

我的程序看起来像这样:


func main() {

    os := Source()

    ns := Source()


    for val := range Sync(ns, os) {

        fmt.Printf("[SYNCED] %v \n", val)

    }

}

预期的行为是我的两个源都将值缓冲到通道中,而我的同步首先从第一个源读取值。然后从第二。比较它们,如果它们相等,则继续两个通道中的下一个。如果不同,我们将发送后面的值并用新值替换它并再次进行相同的比较。


发生的事情是,看起来同步代码对这些值运行了几次,我会多次得到 [SYNCED] 1 之类的东西。为什么?


大话西游666
浏览 156回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go