You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

sync2.go 809 B

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package sync2
  2. import (
  3. "sync"
  4. )
  5. func ParallelDo[T any](args []T, fn func(val T, index int) error) error {
  6. lock := sync.Mutex{}
  7. var err error
  8. var wg sync.WaitGroup
  9. wg.Add(len(args))
  10. for i, arg := range args {
  11. go func(arg T, index int) {
  12. defer wg.Done()
  13. if e := fn(arg, index); e != nil {
  14. lock.Lock()
  15. if err == nil {
  16. err = e
  17. }
  18. lock.Unlock()
  19. }
  20. }(arg, i)
  21. }
  22. wg.Wait()
  23. return err
  24. }
  25. func ParallelDoMap[K comparable, V any](args map[K]V, fn func(k K, v V) error) error {
  26. lock := sync.Mutex{}
  27. var err error
  28. var wg sync.WaitGroup
  29. wg.Add(len(args))
  30. for k, v := range args {
  31. go func(k K, v V) {
  32. defer wg.Done()
  33. if e := fn(k, v); e != nil {
  34. lock.Lock()
  35. if err == nil {
  36. err = e
  37. }
  38. lock.Unlock()
  39. }
  40. }(k, v)
  41. }
  42. wg.Wait()
  43. return err
  44. }