86 lines
1.1 KiB
Go
86 lines
1.1 KiB
Go
package event
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type Job func()
|
|
|
|
type Worker struct {
|
|
id int
|
|
jobChannel chan Job
|
|
quit chan bool
|
|
}
|
|
|
|
type Pool struct {
|
|
workers []*Worker
|
|
jobChannel chan Job
|
|
wg sync.WaitGroup
|
|
}
|
|
|
|
func NewWorker(id int, jobChannel chan Job) *Worker {
|
|
return &Worker{
|
|
id: id,
|
|
jobChannel: jobChannel,
|
|
quit: make(chan bool),
|
|
}
|
|
}
|
|
|
|
func (w *Worker) Start() {
|
|
go func() {
|
|
for {
|
|
select {
|
|
case job := <-w.jobChannel:
|
|
job()
|
|
case <-w.quit:
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
func (w *Worker) Stop() {
|
|
go func() {
|
|
w.quit <- true
|
|
}()
|
|
}
|
|
|
|
func NewPool(numWorkers int) *Pool {
|
|
jobChannel := make(chan Job)
|
|
pool := &Pool{
|
|
workers: make([]*Worker, numWorkers),
|
|
jobChannel: jobChannel,
|
|
}
|
|
|
|
for i := 0; i < numWorkers; i++ {
|
|
worker := NewWorker(i, jobChannel)
|
|
pool.workers[i] = worker
|
|
}
|
|
|
|
return pool
|
|
}
|
|
|
|
func (p *Pool) Start() {
|
|
for _, worker := range p.workers {
|
|
worker.Start()
|
|
}
|
|
}
|
|
|
|
func (p *Pool) Stop() {
|
|
for _, worker := range p.workers {
|
|
worker.Stop()
|
|
}
|
|
}
|
|
|
|
func (p *Pool) AddJob(job Job) {
|
|
p.wg.Add(1)
|
|
p.jobChannel <- func() {
|
|
job()
|
|
p.wg.Done()
|
|
}
|
|
}
|
|
|
|
func (p *Pool) Wait() {
|
|
p.wg.Wait()
|
|
}
|