sync.ThreadGroup
Example usage:
type module struct {
threads sync.ThreadGroup
log *persist.Logger
}
func NewModule() module {
return module{
log: persist.NewLogger(),
}
}
func (m *module) DoSomething() error {
err := m.threads.Add(1)
if err != nil {
return errors.New("Module is closed")
}
defer m.threads.Done()
for {
select {
case <-time.After(1 * time.Second):
// do some work
case <-m.threads.StopChan():
return nil
}
}
// alternatively:
for {
if m.threads.IsStopped() {
return nil
}
// do some work
}
}
func (m *module) Close() error {
err := m.threads.Stop()
if err != nil {
return errors.New("Module already closed")
}
return m.log.Close()
}