mirror of
https://github.com/talent-plan/tinykv.git
synced 2025-02-07 18:20:19 +08:00
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>
61 lines
936 B
Go
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,
|
|
}
|
|
}
|