Skip to content

sync.ThreadGroup

Luke Champine requested to merge shutdown into master

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()
}

Merge request reports