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中切片copy复制和等号复制的区别介绍
Apr 27 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
goland 设置project gopath的操作
May 06 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
入门学习Go的基本语法
Jul 07 Golang
golang为什么要统一错误处理
Apr 03 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
Go语言编译原理之变量捕获
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 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
简易js代码实现计算器操作
2013/04/15 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
animate.css在vue项目中的使用教程
2018/08/05 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python2.x中文乱码问题解决方法
2015/06/02 Python
python正则表达式之作业计算器
2016/03/18 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
python使用minimax算法实现五子棋
2019/07/29 Python
Python实现数值积分方式
2019/11/20 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
浅析Python __name__ 是什么
2020/07/07 Python
利用Python中的Xpath实现一个在线汇率转换器
2020/09/09 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
Belvilla法国:休闲度假房屋出租
2020/10/03 全球购物
西部世纪面试题
2014/12/05 面试题
CNC数控操作工岗位职责
2013/11/19 职场文书
银行存款证明样本
2014/01/17 职场文书
七年级历史教学反思
2014/02/05 职场文书
办公室文员岗位职责
2015/02/04 职场文书
肖申克救赎观后感
2015/06/02 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技