exec.go 898 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package signal
  2. import (
  3. "context"
  4. )
  5. // Execute runs a list of tasks sequentially, returns the first error encountered or nil if all tasks pass.
  6. func Execute(tasks ...func() error) error {
  7. for _, task := range tasks {
  8. if err := task(); err != nil {
  9. return err
  10. }
  11. }
  12. return nil
  13. }
  14. // ExecuteParallel executes a list of tasks asynchronously, returns the first error encountered or nil if all tasks pass.
  15. func ExecuteParallel(ctx context.Context, tasks ...func() error) error {
  16. n := len(tasks)
  17. s := NewSemaphore(n)
  18. done := make(chan error, 1)
  19. for _, task := range tasks {
  20. <-s.Wait()
  21. go func(f func() error) {
  22. if err := f(); err != nil {
  23. select {
  24. case done <- err:
  25. default:
  26. }
  27. }
  28. s.Signal()
  29. }(task)
  30. }
  31. for i := 0; i < n; i++ {
  32. select {
  33. case <-ctx.Done():
  34. return ctx.Err()
  35. case err := <-done:
  36. return err
  37. case <-s.Wait():
  38. }
  39. }
  40. return nil
  41. }