Initial cloud-services repo - gateway service + pkg modules
This commit is contained in:
60
pkg/utils/threadpool/worker.go
Normal file
60
pkg/utils/threadpool/worker.go
Normal file
@@ -0,0 +1,60 @@
|
||||
package threadpool
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// Worker type holds the job channel and passed worker threadpool
|
||||
type Worker struct {
|
||||
jobChannel chan interface{}
|
||||
workerPool chan chan interface{}
|
||||
closeHandle chan bool
|
||||
receiver *sync.WaitGroup
|
||||
}
|
||||
|
||||
// NewWorker creates the new worker
|
||||
func NewWorker(workerPool chan chan interface{}, closeHandle chan bool, waitGroup *sync.WaitGroup) *Worker {
|
||||
|
||||
return &Worker{workerPool: workerPool,
|
||||
jobChannel: make(chan interface{}),
|
||||
closeHandle: closeHandle,
|
||||
receiver: waitGroup,
|
||||
}
|
||||
}
|
||||
|
||||
// Start starts the worker by listening to the job channel
|
||||
func (w Worker) Start() {
|
||||
go func() {
|
||||
defer w.receiver.Done()
|
||||
for {
|
||||
|
||||
// Put the worker to the worker threadpool
|
||||
w.workerPool <- w.jobChannel
|
||||
|
||||
select {
|
||||
// Wait for the job
|
||||
case job := <-w.jobChannel:
|
||||
// Got the job
|
||||
w.executeJob(job)
|
||||
case <-w.closeHandle:
|
||||
// Exit the go routine when the closeHandle channel is closed
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// executeJob executes the job based on the type
|
||||
func (w Worker) executeJob(job interface{}) {
|
||||
// Execute the job based on the task type
|
||||
switch task := job.(type) {
|
||||
case Runnable:
|
||||
task.Run()
|
||||
break
|
||||
case callableTask:
|
||||
response := task.Task.Call()
|
||||
task.Handle.done = true
|
||||
task.Handle.response <- response
|
||||
break
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user