[TASK] add worker

This commit is contained in:
Martin Geno 2017-05-17 14:56:19 +02:00
parent 5240050a5a
commit ea2b3e03f3
No known key found for this signature in database
GPG Key ID: F0D39A37E925E941
2 changed files with 67 additions and 0 deletions

41
worker/main.go Normal file
View File

@ -0,0 +1,41 @@
// Package with a lib for cronjobs to run in background
package worker
import "time"
// Struct which handles the job
type Worker struct {
every time.Duration
run func()
quit chan struct{}
}
// Function to create a new Worker with a timestamp, run, every and it's function
func NewWorker(every time.Duration, f func()) (w *Worker) {
w = &Worker{
every: every,
run: f,
quit: make(chan struct{}),
}
return
}
// Function to start the Worker
// (please us it as a go routine with go w.Start())
func (w *Worker) Start() {
ticker := time.NewTicker(w.every)
for {
select {
case <-ticker.C:
w.run()
case <-w.quit:
ticker.Stop()
return
}
}
}
// Function to stop the Worker
func (w *Worker) Close() {
close(w.quit)
}

26
worker/main_test.go Normal file
View File

@ -0,0 +1,26 @@
// Package with a lib for cronjobs to run in background
package worker
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
)
// Function to test the Worker
func TestWorker(t *testing.T) {
assert := assert.New(t)
runtime := 0
w := NewWorker(time.Duration(5)*time.Millisecond, func() {
runtime = runtime + 1
})
go w.Start()
time.Sleep(time.Duration(18) * time.Millisecond)
w.Close()
assert.Equal(3, runtime)
time.Sleep(time.Duration(8) * time.Millisecond)
}