循路觅宗师,形影不相离,师知吾亦知,吾乃成宗师。

发掘积累过程的快感

首页 » BIBLE模型 » GoLang » go语言 通用线程池

go语言 通用线程池


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 <- &params
         _ = <-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)

}
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼。 “Bible”是圣经,有权威的书,我们的本意就是为开发者提供真正有用的的资料。 我的电子邮件 1217179982@qq.com,您在开发过程中遇到任何问题,欢迎与我联系。
Copyright © 2024. All rights reserved. 本站由 Helay 纯手工打造. 蜀ICP备15017444号