使用golang编写一个并发工作队列


Posted in Golang onMay 08, 2021

其实golang用一个函数可以构建一个并发队列,现在编写一个灵活可控的队列程序

先定义一个工作

type Worker struct {
    ID      int
    RepJobs chan int64
    SM      *SM
    quit    chan bool
}

包含了workid和执行任务的id,上面的SM只是任务具体内容,这个和具体业务相关,大家自己编写自己的SM业务逻辑

然后定义工作池

type workerPool struct {
    workerChan chan *Worker
    workerList []*Worker
}

这个里面定义了一个工作队列的切片,可以自定义工作队列的个数,甚至后期还可以添加work,还定义了一个队列类型的管道。

定义完成过后就可以初始化工作池了

func InitWorkerPool() error {
    n := 3
    WorkerPool = &workerPool{
        workerChan: make(chan *Worker, n),
        workerList: make([]*Worker, 0, n),
    }
    for i := 0; i < n; i++ {
        worker := NewWorker(i)
        WorkerPool.workerList = append(WorkerPool.workerList, worker)
        worker.Start()
        log.Debugf("worker %d started", worker.ID)
    }
    return nil
}

这个里面我写死了worker的个数是3,当然这个可以通过读取配置文件或者参数传递的方式;这个里面逐一启动work

worker.Start(),这个是关键

func (w *Worker) Start() {
    go func() {
        for {
            WorkerPool.workerChan <- w
            select {
            case jobID := <-w.RepJobs:
                log.Debugf("worker: %d, will handle job: %d", w.ID, jobID)
                w.handleRepJob(jobID)
            case q := <-w.quit:
                if q {
                    log.Debugf("worker: %d, will stop.", w.ID)
                    return
                }
            }
        }
    }()
}

这个就是go 启动一个协程,先把自己放到workerChan中,然后不断从w.RepJobs管道中获取任务并执行,如果执行完成后又把自己放回到队列中。

所以如果你要有任务需要执行,放到这个管道中即可

func Dispatch() {
    for {
        select {
        case job := <-jobQueue:
            go func(jobID int64) {
                println("Trying to dispatch job: %d", jobID)
                worker := <-WorkerPool.workerChan
                worker.RepJobs <- jobID
            }(job)
        }
    }
}

从管道中拿出一个worker并把任务id放到worker中去执行。

当然你可以停止worker,甚至可以停止job

func (w *Worker) Stop() {
    go func() {
        w.quit <- true
    }()
}
func (wp *workerPool) StopJobs(jobs []int64) {
    log.Debugf("Works working on jobs: %v will be stopped", jobs)
    for _, id := range jobs {
        for _, w := range wp.workerList {
            if w.SM.JobID == id {
                log.Debugf("found a worker whose job ID is %d, will try to stop it", id)
                w.SM.Stop(id)
            }
        }
    }
}

补充一下,int64和字符串转换。

string到int

int,err:=strconv.Atoi(string)

string到int64

int64, err := strconv.ParseInt(string, 10, 64)

int到string

string:=strconv.Itoa(int)

int64到string

string:=strconv.FormatInt(int64,10)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 #Golang
golang 实现时间戳和时间的转化
May 07 #Golang
Golang Gob编码(gob包的使用详解)
May 07 #Golang
go mod 安装依赖 unkown revision问题的解决方案
解决golang 关于全局变量的坑
May 06 #Golang
Goland使用Go Modules创建/管理项目的操作
解决goland 导入项目后import里的包报红问题
You might like
星际中的相关伤害
2020/03/04 星际争霸
PHP爆绝对路径方法收集整理
2012/09/17 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
Jquery实现Div上下移动示例
2014/04/23 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
python 显示数组全部元素的方法
2018/04/19 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Python内置函数property()如何使用
2020/09/01 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
国际贸易求职信
2014/07/05 职场文书
ktv好的活动方案
2014/08/15 职场文书
施工员岗位职责
2015/02/10 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
六一儿童节致辞
2015/07/31 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python