Files
spyda/internal/worker.go
2021-02-02 13:13:12 +10:00

50 lines
1023 B
Go

package internal
import (
log "github.com/sirupsen/logrus"
)
// Worker attaches to a provided worker pool, and
// looks for tasks on its task channel
type Worker struct {
workerPool chan chan Task
taskChannel chan Task
quit chan bool
}
// NewWorker creates a new worker using the given id and
// attaches to the provided worker pool. It also initializes
// the task/quit channels
func NewWorker(workerPool chan chan Task) *Worker {
return &Worker{
workerPool: workerPool,
taskChannel: make(chan Task),
quit: make(chan bool),
}
}
// Start initializes a select loop to listen for tasks to execute
func (w *Worker) Start() {
go func() {
for {
w.workerPool <- w.taskChannel
select {
case task := <-w.taskChannel:
if err := task.Run(); err != nil {
log.WithError(err).Errorf("error running task %s", task)
}
case <-w.quit:
return
}
}
}()
}
// Stop will end the task select loop for the worker
func (w *Worker) Stop() {
go func() {
w.quit <- true
}()
}