goroutine を複数起動してどれか一つがエラーになった時の終了する
{ broadCastChan := make(chan struct{}, 1) stopChan := make(chan struct{}, len(workers)) var wg sync.WaitGroup for _, worker := range workers { wg.Add(1) go func(worker *Worker) { defer wg.Done() err := worker.Work(broadCastChan) log.Println(err) stopChan <- struct{}{} }(worker) } <-stopChan close(broadCastChan) wg.Wait() }
stopChan に <- struct{}{} する際に block しないように worker 数を capacity に指定。 stopChan で一つでも受け取ったら broadCastChan を close して worker の中で
{ for { select { case <-broadCastChan: // exit return default: // do something } } }
みたいな感じで待っておいて各 worker を終了。
wg.Wait で全ての worker が終わるまで待つ。
こんな感じかなぁ。