golang协程池模拟实现群发邮件功能


Posted in Golang onMay 02, 2021

比如批量群发邮件的功能

因为发送邮件是个比较耗时的操作,

如果是传统的一个个执行 , 总体耗时比较长

可以使用golang实现一个协程池 , 并行发送邮件

pool包下的pool.go文件

package pool

import "log"
//具体任务,可以传参可以自定义操作
type Task struct {
    Args interface{}
    Do func(interface{})error
}
//协程的个数
var Nums int
//任务通道
var JobChannels =make(chan Task)
//入口的任务通道
var Jobs =make(chan Task)
//执行
func Run(){
    for i:=0;i<Nums;i++{
        go worker(i)
    }
    for task:=range Jobs{
        JobChannels<-task
    }
    close(JobChannels)
}
//实际的工作协程worker
func worker(workId int){
    for task:=range JobChannels{
        ret:=task.Do(task.Args)
        log.Printf("worker_id:%d , worker_ret:%v\n",workId,ret)
    }
}

具体的使用

test包下的pool_test.go测试文件

package test
import (
    "errors"
    "gofly/pool"
    "log"
    "testing"
    "time"
)
//真正的模拟发送邮件
func SendEmail(email interface{})error{
    log.Println(email," start..")
    //模拟耗时
    time.Sleep(time.Second*10)
    return errors.New(email.(string)+" end..")
}
//获取邮箱并发送
func GetEmails(){
    //如果数据量比较大分页获取
    page:=1;
    for{
        //模拟每页获取的邮箱
        emails:=[]string{
            "1@qq.com",
            "2@qq.com",
            "3@qq.com",
            "4@qq.com",
            "5@qq.com",
            "6@qq.com",
            "7@qq.com",
        }
        for _,email:=range emails{
            var sendEmailTask=pool.Task{
                Args: email,
                Do: SendEmail,
            }
            //每个邮箱任务塞入任务通道
            pool.Jobs <- sendEmailTask
        }
        log.Printf("page %d done!\n",page)
        page++
    }
}
func TestPool(t *testing.T) {
    //定义5个协程
    pool.Nums = 5
    //开个子协程去不停的获取邮箱
    go GetEmails()
    //执行
    pool.Run()
}

执行go test -v pool_test.go , 效果

golang协程池模拟实现群发邮件功能

到此这篇关于golang协程池模拟实现群发邮件功能的文章就介绍到这了,更多相关golang协程池群发邮件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
go:垃圾回收GC触发条件详解
Apr 24 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
golang 实现对Map进行键值自定义排序
Apr 28 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
golang 比较浮点数的大小方式
May 02 #Golang
解决Golang中goroutine执行速度的问题
May 02 #Golang
解决golang结构体tag编译错误的问题
May 02 #Golang
golang 实现Location跳转方式
May 02 #Golang
解决golang post文件时Content-Type出现的问题
May 02 #Golang
对Golang中的FORM相关字段理解
May 02 #Golang
解决go在函数退出后子协程的退出问题
Apr 30 #Golang
You might like
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
JavaScript判断前缀、后缀是否是空格的方法
2015/04/15 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
JavaScript制作弹出层效果
2016/12/02 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
[01:25]2014DOTA2国际邀请赛 zhou分析LGD比赛情况
2014/07/14 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
详解python中的闭包
2020/09/07 Python
伦敦著名的运动鞋综合商店:Footpatrol
2019/03/25 全球购物
世界汽车零件:World Car Parts
2019/09/04 全球购物
SQL数据库笔试题
2016/03/08 面试题
外贸业务员工作职责
2014/01/06 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
大学生就业求职信
2014/06/12 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python