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中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
对Golang中的FORM相关字段理解
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
goland 设置project gopath的操作
May 06 Golang
go xorm框架的使用
May 22 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
Golang的继承模拟实例
Jun 30 Golang
Go Plugins插件的实现方式
Aug 07 Golang
深入理解go slice结构
Sep 15 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang获取List列表元素的四种方式
Apr 20 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取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JS实现双击编辑可修改状态的方法
2015/08/14 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
vue debug 二种方法
2018/09/16 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
pandas删除指定行详解
2019/04/04 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
就业推荐表自我鉴定
2014/03/21 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
总经理岗位职责
2015/02/04 职场文书
清洁员岗位职责
2015/02/15 职场文书
教导主任个人总结
2015/03/03 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python