加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-05-21 06:46:57 所属栏目:大数据 来源: https://www.jb51.cc
导读:先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里 channel中传递一个Car类型,这个类型主要负责具体做的任务 也就是channel就是运输通道,在这个通道上传递Car这样一个汽车,来一辆车就处理这辆车的工作,

先启动固定数量的goroutine,每个goroutine都在从channel中获取数据,如果这个channel为空,就阻塞等待在那里
channel中传递一个Car类型,这个类型主要负责具体做的任务
也就是channel就是运输通道,在这个通道上传递Car这样一个汽车,来一辆车就处理这辆车的工作,没有车过来那这些工人就在那等着

?

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
}

?

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读