package threading import "sync" // A RoutineGroup is used to group goroutines together and all wait all goroutines to be done. type RoutineGroup struct { waitGroup sync.WaitGroup } // NewRoutineGroup returns a RoutineGroup. func NewRoutineGroup() *RoutineGroup { return new(RoutineGroup) } // Run runs the given fn in RoutineGroup. // Don't reference the variables from outside, // because outside variables can be changed by other goroutines func (g *RoutineGroup) Run(fn func()) { g.waitGroup.Add(1) go func() { defer g.waitGroup.Done() fn() }() } // RunSafe runs the given fn in RoutineGroup, and avoid panics. // Don't reference the variables from outside, // because outside variables can be changed by other goroutines func (g *RoutineGroup) RunSafe(fn func()) { g.waitGroup.Add(1) GoSafe(func() { defer g.waitGroup.Done() fn() }) } // Wait waits all running functions to be done. func (g *RoutineGroup) Wait() { g.waitGroup.Wait() }