|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- package sync2
-
- import (
- "sync"
- )
-
- func ParallelDo[T any](args []T, fn func(val T, index int) error) error {
- lock := sync.Mutex{}
- var err error
-
- var wg sync.WaitGroup
- wg.Add(len(args))
- for i, arg := range args {
- go func(arg T, index int) {
- defer wg.Done()
-
- if e := fn(arg, index); e != nil {
- lock.Lock()
- if err == nil {
- err = e
- }
- lock.Unlock()
- }
- }(arg, i)
- }
- wg.Wait()
-
- return err
- }
-
- func ParallelDoMap[K comparable, V any](args map[K]V, fn func(k K, v V) error) error {
- lock := sync.Mutex{}
- var err error
-
- var wg sync.WaitGroup
- wg.Add(len(args))
- for k, v := range args {
- go func(k K, v V) {
- defer wg.Done()
-
- if e := fn(k, v); e != nil {
- lock.Lock()
- if err == nil {
- err = e
- }
- lock.Unlock()
- }
- }(k, v)
- }
- wg.Wait()
-
- return err
- }
|