[Go] 利用channel实现简单的工作池
发布时间:2021-05-21 06:46:57 所属栏目:大数据 来源: https://www.jb51.cc
导读:先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里 channel中传递一个Car类型,这个类型主要负责具体做的任务 也就是channel就是运输通道,在这个通道上传递Car这样一个汽车,来一辆车就处理这辆车的工作,
先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里 ? package main import ( "log" synctime" ) 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 ) { for f := range p.road { log.Println(workId:",workId,start) f.do() log.Println(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件事 0; i < 10; i++ { car := Car{ param: i,} pool.AddCar(&car) } pool.colse() }() pool.Run() } /*具体做的事通过这个来传递*/ type Car struct { param } func (c *Car) () error { log.Println(time.Now(),c.param) return nil } ? (编辑:北几岛) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |