专栏首页陶士涵的菜地利用channel实现简单的工作池

利用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
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [Go] golang结构体成员与函数类型

    陶士涵
  • [Go] 实现websocket服务端

    如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/golang.org/x/net就行了

    陶士涵
  • [日常] Go语言圣经--并发的web爬虫

    陶士涵
  • 代理模式(Proxy)

    转载 https://blog.csdn.net/lovelion/article/details/8228042

    小狐狸
  • 替换WordPress默认搜索为百度站内搜索(知更鸟主题可照搬)

    今天,中国博客联盟 QQ 群里的【58 说】博友提到百度站长平台推出绿色收录通道了。连忙登陆站长平台看了下,意外的发现张戈博客已开通了站内搜索功能。之前确实给管...

    张戈
  • 互联网时代的【三国演义】

    东汉末年,群雄割据,天下三分,北有曹操虎视眈眈,西有刘备卧薪尝胆,东有孙权厉兵秣马。 这天,曹操邀刘备青梅煮酒,剑指江山,曰 “天下英雄,唯使君与操耳”。 岁月...

    挖数
  • Python学算法入门大全

    这个repo有近23个大牛一起维护的,领头的是一个印度工程师!印度我好几年前出差还是去过,当时去的是号称是印度的“硅谷”班加罗尔,确实软件行业非常发达。来看一下...

    Sam Gor
  • 全面对比指南:Service Mesh能否成为下一代SDN

    作者:James Kelly 译者:月满西楼 原题:Are Service Meshes the Next-Gen SDN? 全文7500字,阅读约需要18...

    yuanyi928
  • 跨平台PHP调试器设计及使用方法——使用

            经过之前六篇博文的分析和介绍,大家应该对这套调试器有个初步的认识。本文我将讲解它的使用方法。(转载请指明出于breaksoftware的csdn...

    方亮
  • 找到源码了!使用python+机器学习方法进行情感分析(详细步骤)

    使用python+机器学习方法进行情感分析(详细步骤) http://www.360doc.com/content/16/0725/19/15165994_57...

    机器学习AI算法工程

扫码关注云+社区

领取腾讯云代金券