talent-plan-tinykv/kv/util/worker/worker.go
Connor 5e089a2cd1 init course framework
Signed-off-by: Connor <zbk602423539@gmail.com>
Co-authored-by: Nick Cameron <nrc@ncameron.org>
Co-authored-by: linning <linningde25@gmail.com>
Co-authored-by: YangKeao <keao.yang@yahoo.com>
Co-authored-by: andylokandy <andylokandy@hotmail.com>
Co-authored-by: Iosmanthus Teng <myosmanthustree@gmail.com>
2020-04-30 15:25:07 +08:00

61 lines
936 B
Go

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,
}
}