50 lines
1023 B
Go
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
|
|
}()
|
|
}
|