task.go 557 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package task
  2. import (
  3. "sync"
  4. )
  5. type Task interface {
  6. Execute() error
  7. }
  8. type ParallelExecutor struct {
  9. sync.Mutex
  10. tasks sync.WaitGroup
  11. errors []error
  12. }
  13. func (pe *ParallelExecutor) track(err error) {
  14. if err == nil {
  15. return
  16. }
  17. pe.Lock()
  18. pe.errors = append(pe.errors, err)
  19. pe.Unlock()
  20. }
  21. func (pe *ParallelExecutor) Execute(task Task) {
  22. pe.tasks.Add(1)
  23. go func() {
  24. pe.track(task.Execute())
  25. pe.tasks.Done()
  26. }()
  27. }
  28. func (pe *ParallelExecutor) Wait() {
  29. pe.tasks.Wait()
  30. }
  31. func (pe *ParallelExecutor) Errors() []error {
  32. return pe.errors
  33. }