为了账号安全,请及时绑定邮箱和手机立即绑定

如何在管道中同步 goroutine

如何在管道中同步 goroutine

Go
大话西游666 2021-10-25 16:54:28
我需要帮助来理解为什么以下代码不起作用。我正在构建一个管道并尝试执行一个步骤来同步来自两个源通道的值。我的源代码/生成器代码如下所示(在我的真实代码中,我从文件中读取文本)。来源已排序,但不能保证值在两个来源中。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 之类的东西。为什么?
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信