欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Go] 利用channel实现简单的工作池

程序员文章站 2023-02-03 12:47:21
先启动固定数量的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
}