2019-03-24 20:27:28 +00:00
|
|
|
package repository
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"golang.org/x/sync/errgroup"
|
|
|
|
)
|
|
|
|
|
|
|
|
// RunWorkers runs count instances of workerFunc using an errgroup.Group.
|
|
|
|
// After all workers have terminated, finalFunc is run. If an error occurs in
|
|
|
|
// one of the workers, it is returned. FinalFunc is always run, regardless of
|
|
|
|
// any other previous errors.
|
2020-01-27 15:28:21 +00:00
|
|
|
func RunWorkers(ctx context.Context, count int, workerFunc func() error, finalFunc func()) error {
|
2020-03-06 22:32:12 +00:00
|
|
|
wg, _ := errgroup.WithContext(ctx)
|
2019-03-24 20:27:28 +00:00
|
|
|
|
|
|
|
// run workers
|
|
|
|
for i := 0; i < count; i++ {
|
|
|
|
wg.Go(workerFunc)
|
|
|
|
}
|
|
|
|
|
|
|
|
// wait for termination
|
|
|
|
err := wg.Wait()
|
|
|
|
|
|
|
|
// make sure finalFunc is run
|
2020-01-27 15:28:21 +00:00
|
|
|
finalFunc()
|
2019-03-24 20:27:28 +00:00
|
|
|
|
2020-01-27 15:41:46 +00:00
|
|
|
// return error from workers to the caller
|
|
|
|
return err
|
2019-03-24 20:27:28 +00:00
|
|
|
}
|