gpt4 book ai didi

go - 使用 WaitGroup 完成goroutine

转载 作者:行者123 更新时间:2023-12-01 22:39:43 27 4
gpt4 key购买 nike

我已经在stdout和stderr goroutine中添加了以下内容(Go func()…),以等待获取output并完成error
现在我希望外部函数将等待,直到两个例程都完成为止。

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())
}
}()

}



现在,我尝试添加 WaitGroup ,但是由于无法确定如何传递 WaitGroup 实例,因此无法正常工作吗?
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 literal,因此可以直接引用在周围函数中声明的变量。

另外,您可以省略第二个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()
}

关于go - 使用 WaitGroup 完成goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58819027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com