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
golang interface判断为空nil的实现代码
Apr 24 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
golang 比较浮点数的大小方式
May 02 Golang
解决golang 关于全局变量的坑
May 06 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
Golang的继承模拟实例
Jun 30 Golang
Go语言基础知识点介绍
Jul 04 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Python测试框架pytest核心库pluggy详解
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
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
Vue学习笔记进阶篇之vue-router安装及使用方法
2017/07/19 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
Python网络编程详解
2017/10/31 Python
matplotlib绘制动画代码示例
2018/01/02 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
2019/11/29 Python
python标识符命名规范原理解析
2020/01/10 Python
keras打印loss对权重的导数方式
2020/06/10 Python
Python with语句用法原理详解
2020/07/03 Python
企业诚信承诺书
2014/05/23 职场文书
公共场所禁烟标语
2014/06/25 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
2014年实习生工作总结
2014/11/27 职场文书
幼儿教师个人总结
2015/02/05 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
学习计划是什么
2019/04/30 职场文书
导游词之天下银坑景区
2019/11/21 职场文书