[英]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.