A Go package for managing a group of goroutines that returns results iteratively in the order tasks are added.
package main
import (
"context"
"fmt"
"time"
"github.com/weirdname404/taskgroup"
)
func taskThatUsesCtx(ctx context.Context) string {
// something is happening that requires context ...
time.Sleep(time.Duration(50 * time.Millisecond))
return "taskgroup"
}
func task() string {
// something is happening ...
time.Sleep(time.Duration(200 * time.Millisecond))
return "hello "
}
func main() {
tgr := taskgroup.NewTaskGroup[string](context.TODO()).Limit(2)
err := tgr.Add(task)
if err != nil {
panic(err)
}
err = tgr.Add(taskThatUsesCtx)
if err != nil {
panic(err)
}
// Start tasks
res := ""
for v := range tgr.Start() {
res += v
}
err = tgr.Error()
if err != nil {
panic(err)
}
fmt.Println(res)
}
Result
hello taskgroup
// cancelling context stops all tasks in the taskgroup
ctx := context.TODO()
// 1. You must specify the type of the task results by the type parameter;
// 2. Concurrency limit is optional, but the default is NO LIMIT;
tgr := taskgroup.NewTaskGroup[string](ctx).Limit(2)
// adding tasks DOES NOT START them
err := tgr.Add(task)
// task may have an unsupported format, so it is better to check for errors
if err != nil {
panic(err)
}
// you can add tasks that either require context or not
err = tgr.Add(taskThatUsesCtx)
if err != nil {
panic(err)
}
// Start tasks
res := ""
for v := range tgr.Start() {
res += v
}
// at least one error stops the group;
err = tgr.Error()
if err != nil {
panic(err)
}
package main
import (
"context"
"errors"
"fmt"
"time"
"github.com/weirdname404/taskgroup"
)
var TaskError = errors.New("Task error")
func task() string {
return "hello "
}
func taskThatReturnsError() (string, error) {
// something is happening ...
time.Sleep(time.Duration(100 * time.Millisecond))
return "", TaskError
}
func main() {
tgr := taskgroup.NewTaskGroup[string](context.TODO()).Limit(2)
err := tgr.Add(task)
if err != nil {
panic(err)
}
err = tgr.Add(taskThatReturnsError)
if err != nil {
panic(err)
}
// Start tasks
res := ""
for v := range tgr.Start() {
res += v
}
err = tgr.Error()
if err != nil {
fmt.Printf("Taskgroup returns error - %s\n", err.Error())
}
}
Result
Taskgroup returns error - Task error