[Go] 利用channel实现简单的工作池
程序员文章站
2022-05-31 19:39:16
先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里channel中传递一个Car类型,这个类型主要负责具体做的任务也就是channel就是运输通道,在这个通道上传递Car这样一个汽车,来一辆车就处理这辆车的工作,没有 ......
先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里
channel中传递一个car类型,这个类型主要负责具体做的任务
也就是channel就是运输通道,在这个通道上传递car这样一个汽车,来一辆车就处理这辆车的工作,没有车过来那这些工人就在那等着
package main import ( "log" "sync" "time" ) type pool struct { workernum int road chan *car wg sync.waitgroup } //初始化这个对象 func newpool(wn int) *pool { return &pool{workernum: wn, road: make(chan *car)} } //往channel添加具体任务 func (p *pool) addcar(f *car) { p.road <- f } //goroutine去工作 func (p *pool) work(workid int) { for f := range p.road { log.println("workid:", workid, "start") f.do() log.println("workid:", workid, "done") } p.wg.done() } //创建goroutine等着接工作 func (p *pool) run() { for i := 0; i < p.workernum; i++ { go p.work(i) p.wg.add(1) } p.wg.wait() } func (p *pool) colse() { close(p.road) } func main() { pool := newpool(5) go func() { //模拟要做10件事 for i := 0; i < 10; i++ { car := car{ param: i, } pool.addcar(&car) } pool.colse() }() pool.run() } /*具体做的事通过这个来传递*/ type car struct { param int } func (c *car) do() error { log.println(time.now(), c.param) return nil }
下一篇: 罗隐:十试不第的大才子,被宰相女儿看上