亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在管道中同步 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 關注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號