Documentation
¶
Overview ¶
Package semgroup provides synchronization and error propagation, for groups of goroutines working on subtasks of a common task. It uses a weighted semaphore implementation to make sure that only a number of maximum tasks can be run at any time.
Unlike golang.org/x/sync/errgroup, it doesn't return the first non-nil error, rather it accumulates all errors and returns a set of errors, allowing each task to fullfil their task.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Group ¶
type Group struct {
// contains filtered or unexported fields
}
A Group is a collection of goroutines working on subtasks that are part of the same overall task.
Example (Parallel) ¶
This example increases a counter for each visit concurrently, using a SemGroup to block until all the visitors have finished. It only runs 2 tasks at any time.
package main
import (
"context"
"fmt"
"sync"
"github.com/fatih/semgroup"
)
func main() {
const maxWorkers = 2
s := semgroup.NewGroup(context.Background(), maxWorkers)
var (
counter int
mu sync.Mutex // protects visits
)
visitors := []int{5, 2, 10, 8, 9, 3, 1}
for _, v := range visitors {
v := v
s.Go(func() error {
mu.Lock()
counter += v
mu.Unlock()
return nil
})
}
// Wait for all visits to complete. Any errors are accumulated.
if err := s.Wait(); err != nil {
fmt.Println(err)
}
fmt.Printf("Counter: %d", counter)
}
Output: Counter: 38
Example (WithErrors) ¶
package main
import (
"context"
"errors"
"fmt"
"github.com/fatih/semgroup"
)
func main() {
const maxWorkers = 2
s := semgroup.NewGroup(context.Background(), maxWorkers)
visitors := []int{1, 1, 1, 1, 2, 2, 1, 1, 2}
for _, v := range visitors {
v := v
s.Go(func() error {
if v != 1 {
return errors.New("only one visitor is allowed")
}
return nil
})
}
// Wait for all visits to complete. Any errors are accumulated.
if err := s.Wait(); err != nil {
fmt.Println(err)
}
}
Output: 3 error(s) occurred: * only one visitor is allowed * only one visitor is allowed * only one visitor is allowed
func NewGroup ¶
NewGroup returns a new Group with the given maximum combined weight for concurrent access.
func (*Group) Go ¶
On success, returns nil. On failure, returns ctx.Err() and leaves the semaphore unchanged. Any function call to return a non-nil error is accumulated; the accumulated errors will be returned by Wait.
func (*Group) Wait ¶
Wait blocks until all function calls from the Go method have returned, then returns all accumulated non-nil errors (if any) from them.
If a non-nil error is returned, it will be of type MultiError.
type MultiError ¶ added in v1.3.0
type MultiError []error
func (MultiError) As ¶ added in v1.3.0
func (e MultiError) As(target interface{}) bool
func (MultiError) Error ¶ added in v1.3.0
func (e MultiError) Error() string
func (MultiError) ErrorOrNil ¶ added in v1.3.0
func (e MultiError) ErrorOrNil() error
ErrorOrNil returns nil if there are no errors, otherwise returns itself.
func (MultiError) Is ¶ added in v1.3.0
func (e MultiError) Is(target error) bool