美文网首页
Go执行任务,这一文就说明了

Go执行任务,这一文就说明了

作者: mick_ | 来源:发表于2019-11-13 14:58 被阅读0次

大家在开发过程中肯定遇见过批量任务处理的,一般都是串行执行,今天我们来个并发版本的

  • 创建一个批量执行任务的结构体(也就是面向对象的类)
  • 生成要执行的任务
  • 执行任务
  • 等待执行完成,关闭任务
    学习快知识点,需要掌握
  • sync.WaitGroup
  • 通道
  • 并发
// @Title  请填写文件名称(需要改)
// @Description  请填写文件描述(需要改)
package main

import (
    "fmt"
    "sync"
    "time"
)

type Worker interface {
    Task()
}
type Pool struct {
    work chan Worker    `desc:"任务接口需要实现"`
    wg   sync.WaitGroup `desc:"并发等待组"`
}

// @title    初始化一个任务池
// @description   初始化一个任务池
// @param     goNum        int         "任务池的容量"
func New(goNum int) *Pool {
    // TODO 初始化一个任务池
    p := &Pool{
        work: make(chan Worker),
        wg:   sync.WaitGroup{},
    }
    // TODO 追加等待组
    p.wg.Add(goNum)
    // TODO 创建任务池
    for i := 0; i < goNum; i++ {
        go func() {
            for w := range p.work {
                w.Task()
            }
            p.wg.Done()
        }()
    }
    return p
}
func (p *Pool) initWork(wg *sync.WaitGroup, works ...Worker) {
    wg.Add(len(works))
    for _, work := range works {
        go func(work Worker) {
            p.Run(work)
            wg.Done()
        }(work)
    }
}

// @title    运行的函数
// @description  将要执行的函数发送到通道
// @param     w         Worker         "解释"
func (p *Pool) Run(w Worker) {
    p.work <- w
}

// @title    关闭任务池
// @description   关闭任务池
func (p *Pool) ShutDown() {
    // TODO 关闭通道
    close(p.work)
    // TODO 等待goruntinue关闭
    p.wg.Wait()
}

type namePrint struct {
    name string `desc:"名字"`
}

// @title    输入名字
// @description   输入名字,实现上面的worker接口
func (n *namePrint) Task() {
    fmt.Println(n.name)
    time.Sleep(time.Microsecond * 100)
}

// @title    生成namePrint切片
// @description   生成namePrint切片
// @return    namePrints        []*namePrint     "namePrint切片"
func generateNamePrint() (namePrints []Worker) {
    // TODO 声明一个名字切片
    names := []string{"one", "two", "three", "four", "five"}
    for _, name := range names {
        np := &namePrint{name: name}
        namePrints = append(namePrints, np)
    }
    return
}
func main() {
    // TODO 创建一个任务的等待组
    wg := &sync.WaitGroup{}
    // TODO 使用两个goroutine来创建工作池
    p := New(2)
    // TODO 生成执行任务
    p.initWork(wg, generateNamePrint()...)
    // TODO 等待执行
    wg.Wait()
    // TODO 关闭执行
    p.ShutDown()

}

相关文章

  • Go执行任务,这一文就说明了

    大家在开发过程中肯定遇见过批量任务处理的,一般都是串行执行,今天我们来个并发版本的 创建一个批量执行任务的结构体(...

  • 如风往事之——闲话电风扇

    笔者曾经写过一篇名叫《扇子》的拙文,开门见山就说明了,首先发明了扇子的国家是中国,是由中国古人率先发明了“...

  • #动手返现4#生命的呐喊

    青词/文 人,生下来,拿到什么牌,谁也无法选择。但你可以决定,怎么打好这手牌。 崔万志的故事,就说明了这一点。 他...

  • 【无戒学堂】结构性思维 上

    文|烽火长歌 说起来惭愧,本来是学习结构化表达,这一点芭芭拉写《金字塔原理》的时候就说明了,这本书对写作指导意义重...

  • 2022-02-15

    人的耐性不是由性格决定的,而是体力,一个精力旺盛的人往往耐心都不会差,在人类的词语中就说明了这一点 耐心拆文解字为...

  • go语言的工厂模式

    有一工程如下: model包中的student.go源码: student.go声明了一个Student的结构体,...

  • golang 源码剖析(5): 并发调度

    概述 基本流程 用go func() 创建G 放入P本地队列,或平衡到全局队列 唤醒或新建M执行任务 进入调度循环...

  • 老板问web前端女程序员为什么晚上8点就走,网友:明天就提离职

    如今的职场,很多公司都盛行加班文化,像前阵子热议的“996”现象,其实就说明了这一点。职场中,偶尔加班其实也正常,...

  • interface

    (1)在go里面interface的出现更像是一种多态的模式声明了interface,声明了方法其他对象就可以实现...

  • 玩转区块链(13)

    区块链的内涵与外延非常广阔,今天的考前动员与培训就说明了这一点。 李校长主持,请杨校长讲具体有关事项。 注意集合时...

网友评论

      本文标题:Go执行任务,这一文就说明了

      本文链接:https://www.haomeiwen.com/subject/dughictx.html