package ThreadPools
// 通用线程池 模块
//
import (
"time"
)
// 外部调用的 线程池工作器
func (p *ThreadPools) Worker(params Rule) {
for i := 0; i < p.Sizes; i++ {
flg := p.ch[i].flag
if flg == 0 {
p.ch[i].ch <- ¶ms
_ = <-p.ch[i].outch
break
}
if i == p.Sizes-1 {
i = 0
}
time.Sleep(time.Nanosecond)
}
}
// 任务处理回调
type Rule struct {
Func func(pa interface{})
Params interface{}
}
// 处理队列
type task struct {
ch chan *Rule
flag uint8
outch chan *int
out int
}
// 线程池
type ThreadPools struct {
Sizes int
ch []task
}
// 初始化线程池
func (p *ThreadPools) Init() {
var i int
p.ch = make([]task, p.Sizes)
for i = 0; i < p.Sizes; i++ {
p.ch[i].ch = make(chan *Rule)
p.ch[i].out = 1
p.ch[i].outch = make(chan *int)
p.ch[i].flag = 0
go p.run(&p.ch[i])
}
}
// 创建指定数量的线程池
func (p *ThreadPools) run(c *task) {
for {
c.flag = 0
i := <-c.ch
c.flag = 1
c.outch <- &c.out
i.Func(i.Params)
}
}
外部调用开始:
var pools = ThreadPools.ThreadPools{
Sizes:150, //允许运行的最大任务数
}
// 初始化线程
pools.Init()
// 测试一千万次的调用难过
for i:=1;i<10000000;i++{
var task=ThreadPools.Rule{
Func: func(pa interface{}) {
fmt.Println(i)
},
Params:a,
}
// 走线程池下发数据。
pools.Worker(task)
}