Files
jx-callback/business/jxstore/event/timing_task.go
邹宗楠 999c3d7ebe 1
2026-01-30 10:00:57 +08:00

105 lines
1.4 KiB
Go

package event
import (
"sync"
)
var Poll *Pool
func init() {
Poll = NewPool(500)
Poll.Start()
}
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() {
w.quit <- true
close(w.quit)
//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) AddJob(job Job) {
p.wg.Add(1)
go func() {
p.jobChannel <- func() {
defer p.wg.Done()
job()
}
}()
}
func (p *Pool) Wait() {
p.wg.Wait()
}