zoukankan      html  css  js  c++  java
  • [Go] 利用channel实现简单的工作池

    先启动固定数量的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
    }
  • 相关阅读:
    Python day thirteen
    Python day twelve
    Python day eleven
    Python day ten
    Python day nine
    Python day eight
    Python day seven
    Python day six
    Python day five
    Python day four
  • 原文地址:https://www.cnblogs.com/taoshihan/p/11918442.html
Copyright © 2011-2022 走看看