package worker import "sync" type TaskStop struct{} type Task interface{} type Worker struct { name string sender chan<- Task receiver <-chan Task closeCh chan struct{} wg *sync.WaitGroup } type TaskHandler interface { Handle(t Task) } type Starter interface { Start() } func (w *Worker) Start(handler TaskHandler) { w.wg.Add(1) go func() { defer w.wg.Done() if s, ok := handler.(Starter); ok { s.Start() } for { Task := <-w.receiver if _, ok := Task.(TaskStop); ok { return } handler.Handle(Task) } }() } func (w *Worker) Sender() chan<- Task { return w.sender } func (w *Worker) Stop() { w.sender <- TaskStop{} } const defaultWorkerCapacity = 128 func NewWorker(name string, wg *sync.WaitGroup) *Worker { ch := make(chan Task, defaultWorkerCapacity) return &Worker{ sender: (chan<- Task)(ch), receiver: (<-chan Task)(ch), name: name, wg: wg, } }