| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- package signal
- import (
- "context"
- )
- // Execute runs a list of tasks sequentially, returns the first error encountered or nil if all tasks pass.
- func Execute(tasks ...func() error) error {
- for _, task := range tasks {
- if err := task(); err != nil {
- return err
- }
- }
- return nil
- }
- // ExecuteParallel executes a list of tasks asynchronously, returns the first error encountered or nil if all tasks pass.
- func ExecuteParallel(ctx context.Context, tasks ...func() error) error {
- n := len(tasks)
- s := NewSemaphore(n)
- done := make(chan error, 1)
- for _, task := range tasks {
- <-s.Wait()
- go func(f func() error) {
- if err := f(); err != nil {
- select {
- case done <- err:
- default:
- }
- }
- s.Signal()
- }(task)
- }
- for i := 0; i < n; i++ {
- select {
- case <-ctx.Done():
- return ctx.Err()
- case err := <-done:
- return err
- case <-s.Wait():
- }
- }
- return nil
- }
|