고루틴을 동기화하기 위해 go가 선호하는 방법은 무엇입니까?
-
27-12-2019 - |
문제
슬라이스의 모든 항목에 적용하는 값비싼 기능이 있습니다.저는 이를 처리하기 위해 고루틴을 사용하고 있습니다. 각 고루틴은 슬라이스의 한 항목을 처리합니다.
func Huge(lst []foo) {
for _, item := range lst {
go performSlow(item)
}
// How do I synchronize here ?
return someValue(lst)
}
문제는 주석에 표시된 것처럼 모든 고루틴이 작업을 완료한 후 호출하기 전에 기다리는 가장 좋은 방법이 무엇인지입니다. someValue
기능 ?채널을 전달하기 performSlow
모든 사람이 글을 쓸 때까지 기다리는 것이 효과가 있지만 너무 지나친 것 같습니다.
func Huge(lst []foo) {
ch := make(chan bool)
for _, item := range lst {
go performSlow(item, ch) // performSlow does its job, then writes a dummy value to ch
}
for i := range lst {
_ = <-ch
}
return someValue(lst)
}
더 나은 것이 있습니까(예:더 효율적이고/또는 더 관용적) 방법은 무엇입니까?
해결책
sync.WaitGroup을 사용하세요(http://godoc.org/sync#WaitGroup)
func Huge(lst []foo) {
var wg sync.WaitGroup
for _, item := range lst {
wg.Add(1)
go func() {
performSlow(item)
wg.Done()
}()
}
wg.Wait()
return someValue(lst)
}
제휴하지 않습니다 StackOverflow