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 相关文章推荐
golang判断key是否在map中的代码
Apr 24 Golang
go原生库的中bytes.Buffer用法
Apr 25 Golang
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
go设置多个GOPATH的方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言入门exec的基本使用
May 20 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
GO中sync包自由控制并发示例详解
Aug 05 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模板技术原理【一】
2008/01/10 PHP
PHP仿盗链代码
2012/06/03 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
php删除指定目录的方法
2015/04/03 PHP
php筛选不存在的图片资源
2015/04/28 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
浅谈Angular中ngModel的$render
2016/10/24 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
原生js拖拽实现图形伸缩效果
2020/02/10 Javascript
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
python自定义类并使用的方法
2015/05/07 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
Python-接口开发入门解析
2019/08/01 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
Python API len函数操作过程解析
2020/03/05 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
C#软件工程师英语面试题
2015/06/07 面试题
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
教师党员个人整改措施
2014/10/27 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL