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

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

在比較兩個單獨的 goroutine 中的兩個切片并使用 sync.Waitgroup

在比較兩個單獨的 goroutine 中的兩個切片并使用 sync.Waitgroup

Go
Cats萌萌 2022-01-04 21:19:16
我正在學習goroutines,并在兩個goroutines中相互比較兩個切片,這是在無限循環中永遠比較它,這可能不是最好的例子,我無法弄清楚為什么它被掛起。for ;; {    var wg sync.WaitGroup    wg.Add(2)    go FindinFirst(&Arr1, &Arr2, AddChan, &wg)    go FindinSecond(&Arr2, &Arr1, DelChan, &wg)    counter := 0        for ; ; {            select {            case Add, ok := <- AddChan:                if ok == true {                    for k, v := range Add  {                        fmt.Println(k, ":", v)                    }                }else {                    counter += 1                }            case Del, ok := <- DelChan:                if ok == true {                    for k, v := range Del  {                        fmt.Println(k, ":", v)                    }                }else {                    counter += 1                    }            }            if counter == 2{                break            }            wg.Wait()}函數 FindinFirst 是func FindinFirst(Arr1, Arr2 *[]string, AddChan chan string, wg *sync.WaitGroup){defer wg.Done()fmt.Println("Starting FindinFirst")defer close(AddChan)for _, i := range *Arr1 {    if IfExists(i, *Arr2) {        fmt.Println("Exists")        continue    } else {        AddChan <- i    }}}函數 FindinSecond 是func FindinSecond(Arr2, Arr1 *[]string, DelChan chan string, wg *sync.WaitGroup){defer wg.Done()fmt.Println("Starting FindinSecond")defer close(DelChan)for _, i := range *Arr2 {    if IfExists(i, *Arr1) {        fmt.Println("Exists")        continue    } else {        DelChan <- i    }}}并且IfExists只是一個函數,如果值存在于切片中,則返回一個布爾值。但是,該例程只打印一個值,我不確定為什么會發生這種情況。兩個切片都有接近 1000 個值,并且都具有唯一性。代碼有什么問題?
查看完整描述

1 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

我不認為在這里使用等待組有任何用處...由于您正在使用 for 循環內的通道,所以 putwg.wait()將阻塞,直到所有等待組都完成。


在這種情況下,除非有人在等待,否則將值放入 AddChan 將被阻止。該代碼僅適用于第一種情況,之后它會掛起。


您可以刪除wg.wait()for 循環和外部 for 循環,它會起作用。


func main() {

    Arr1 := []string{"a", "b", "c", "d"}

    Arr2 := []string{"c", "e", "f", "g"}

    AddChan := make(chan string)

    DelChan := make(chan string)


    var wg sync.WaitGroup

    wg.Add(2)

    go FindinFirst(&Arr1, &Arr2, AddChan, &wg)

    go FindinSecond(&Arr2, &Arr1, DelChan, &wg)

    counter := 0

    for {

        select {

        case Add, ok := <-AddChan:

            if ok == true {

               fmt.Println(Add)

            } else {

                counter += 1

            }

        case Del, ok := <-DelChan:

            if ok == true {

                fmt.Println(Del)

            } else {

                counter += 1

            }

        }


        //if both the channels are closed, we are good, hence exit

        if counter == 2 {

            break

        }

    }

}


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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