Documentation
¶
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.
A zero Group is valid and does not cancel on error.
Example (Cancel) ¶
g := WithCancel(context.Background())
g.Go(fakeRunTask)
g.Go(fakeRunTask)
if err := g.Wait(); err != nil { //nolint:all
// handle err
}
Example (Ctx) ¶
g := WithContext(context.Background())
g.Go(fakeRunTask)
g.Go(fakeRunTask)
if err := g.Wait(); err != nil { //nolint:all
// handle err
}
Example (Group) ¶
g := Group{}
g.Go(fakeRunTask)
g.Go(fakeRunTask)
if err := g.Wait(); err != nil { //nolint:all
// handle err
}
Example (JustErrors) ¶
JustErrors illustrates the use of a Group in place of a sync.WaitGroup to simplify goroutine counting and error handling. This example is derived from the sync.WaitGroup example at https://golang.org/pkg/sync/#example_WaitGroup.
var g Group
urls := []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for _, url := range urls {
// Launch a goroutine to fetch the URL.
url := url // https://golang.org/doc/faq#closures_and_goroutines
g.Go(func(context.Context) error {
// Fetch the URL.
resp, err := http.Get(url)
if err == nil {
resp.Body.Close()
}
return err
})
}
// Wait for all HTTP fetches to complete.
if err := g.Wait(); err == nil {
fmt.Println("Successfully fetched all URLs.")
}
Example (Maxproc) ¶
g := Group{}
// set max concurrency
g.GOMAXPROCS(2)
g.Go(fakeRunTask)
g.Go(fakeRunTask)
if err := g.Wait(); err != nil { //nolint:all
// handle err
}
Example (Parallel) ¶
Parallel illustrates the use of a Group for synchronizing a simple parallel task: the "Google Search 2.0" function from https://talks.golang.org/2012/concurrency.slide#46, augmented with a Context and error-handling.
Google := func(ctx context.Context, query string) ([]Result, error) {
g := WithContext(ctx)
searches := []Search{Web, Image, Video}
results := make([]Result, len(searches))
for i, search := range searches {
i, search := i, search // https://golang.org/doc/faq#closures_and_goroutines
g.Go(func(context.Context) error {
result, err := search(ctx, query)
if err == nil {
results[i] = result
}
return err
})
}
if err := g.Wait(); err != nil {
return nil, err
}
return results, nil
}
results, err := Google(context.Background(), "golang")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
for _, result := range results {
fmt.Println(result)
}
Output: web result for "golang" image result for "golang" video result for "golang"
func WithCancel ¶
WithCancel create a new Group and an associated Context derived from ctx.
given function from Go will receive context derived from this ctx, The derived Context is canceled the first time a function passed to Go returns a non-nil error or the first time Wait returns, whichever occurs first.
func WithContext ¶
WithContext create a Group. given function from Go will receive this context,