문제

슬라이스의 모든 항목에 적용하는 값비싼 기능이 있습니다.저는 이를 처리하기 위해 고루틴을 사용하고 있습니다. 각 고루틴은 슬라이스의 한 항목을 처리합니다.

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)
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top