簡體   English   中英

使用等待組來完成 goroutine

[英]using wait group to finish the goroutine

我已將以下內容添加到 stdout 和 stderr goroutine (go func() ...) 以等待獲取output並完成error 現在我希望外部 function將等到兩個例程完成

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)
go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()

go func() {
scanerr.Split(bufio.ScanRunes)
        for scanerr.Scan() {
            fmt.Print(scanerr.Text())
        }
}()

}


現在我嘗試添加等待組,但它不起作用,因為我不確定如何傳遞等待組實例,知道嗎?

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)

var waitgroup sync.WaitGroup
waitgroup.Add(1)

go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()

waitgroup.Wait()
waitgroup.Add(1)

go func() {
scanerr.Split(bufio.ScanRunes)
        for scanerr.Scan() {
            fmt.Print(scanerr.Text())
        }
}()
waitgroup.Wait()

}

更新

應該是這樣嗎?

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)

var waitgroup sync.WaitGroup
waitgroup.Add(2)

go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()

go func() {
scanerr.Split(bufio.ScanRunes)
        for scanerr.Scan() {
            fmt.Print(scanerr.Text())
        }
}()
waitgroup.Wait()

}

您不需要將WaitGroup實例傳遞給 goroutine,因為您使用的是function 文字,您可以直接引用在周圍 function 中聲明的變量。

您也可以省略第二個 goroutine,您的用例並不真正需要它。

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {
    scanout := bufio.NewScanner(stdout)
    scanout.Split(bufio.ScanRunes)

    var wg sync.WaitGroup
    wg.Add(1)

    // exec scanout in its own goroutine
    go func() {
        for scanout.Scan() {
            fmt.Print(scanout.Text())
        }
        wg.Done()
    }()

    // exec scanerr
    scanerr.Split(bufio.ScanRunes)
    for scanerr.Scan() {
        fmt.Print(scanerr.Text())
    }

    // wait for scanout
    wg.Wait()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM