golang实现任务调度器dispatcher

package dispatcher

type Job interface {
	Do() error
}

var JobQueue chan Job
var DispatcherInstance *Dispatcher

type worker struct {
	workerId    int
	workerQueue chan Job
	quit        chan bool
}

func (w *worker) Start() {
	go func() {
		for {
			DispatcherInstance.idleWorker <- w.workerId
			select {
			case job := <-w.workerQueue:
				job.Do()
			case <-w.quit:
				return
			}
		}
	}()
}
func (w worker) Stop() {
	go func() {
		w.quit <- true
	}()
}

type Dispatcher struct {
	Name       string
	maxWorkers int
	idleWorker chan int
	workerList []worker
}

func New(maxWorkerNum, maxQueueNum int) *Dispatcher {
	JobQueue = make(chan Job, maxQueueNum)

	DispatcherInstance = &Dispatcher{
		idleWorker: make(chan int, maxWorkerNum),
		Name:       "Dispatcher001",
		maxWorkers: maxWorkerNum,
	}

	return DispatcherInstance
}

func (d *Dispatcher) Run() {
	d.workerList = make([]worker, d.maxWorkers)
	for i := 0; i < d.maxWorkers; i++ {
		d.workerList[i] = worker{
			workerId:    i,
			workerQueue: make(chan Job),
			quit:        make(chan bool),
		}

		d.workerList[i].Start()
	}
	go func() {
		for {
			select {
			case job := <-JobQueue:
				workerId := <-d.idleWorker
				d.workerList[workerId].workerQueue <- job
			}
		}
	}()
}

func (d *Dispatcher) Dispatch(job Job) {
	JobQueue <- job
}

func (d *Dispatcher) Close() {
	for _, w := range d.workerList {
		w.Stop()
	}
}

使用

package dispatcher

import (
	"log"
	"strconv"
	"time"
)

func Run() {
	dispatcher := New(10, 100)
	dispatcher.Run()

	for i := 1; i <= 100; i++ {
		dispatcher.Dispatch(Dog{
			Name: "dog" + strconv.Itoa(i),
		})
	}

	time.Sleep(time.Second * 5)
}

type Dog struct {
	Name string
}

func (d Dog) Do() error {
	log.Println("Dog Eat", d.Name)
	return nil
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值