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 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
golang正则之命名分组方式
Apr 25 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang switch语句的灵活写法介绍
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
详解Go语言中Get/Post请求测试
Jun 01 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多个文件上传到服务器实例
2014/10/29 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
PHP asXML()函数讲解
2019/02/03 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
cookie的secure属性详解
2015/04/08 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
Angular实现下载安装包的功能代码分享
2017/09/05 Javascript
js构建二叉树进行数值数组的去重与优化详解
2018/03/26 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
Element Badge标记的使用方法
2020/07/27 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
python 自动提交和抓取网页
2009/07/13 Python
python批量导出导入MySQL用户的方法
2013/11/15 Python
python字典操作实例详解
2017/11/16 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
python3下载抖音视频的完整代码
2019/06/05 Python
如何教少儿学习Python编程
2020/07/10 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
python实现ping命令小程序
2020/12/28 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
通用自荐信范文
2014/03/14 职场文书
毕业设计论文评语
2014/12/31 职场文书
广播体操比赛主持词
2015/06/29 职场文书
教师节晚会主持词
2015/06/30 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers