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 相关文章推荐
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
go语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go语言怎么使用变长参数函数
Jul 15 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
第二章 PHP入门基础之php代码写法
2011/12/30 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
2019/05/01 PHP
网站上面有这种切换效果
2006/06/26 Javascript
JS的反射问题
2010/04/07 Javascript
JavaScript的strict模式与with关键字介绍
2014/02/08 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
Python 爬虫的工具列表大全
2016/01/31 Python
python executemany的使用及注意事项
2017/03/13 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python全栈之列表数据类型详解
2019/10/01 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
2013年高中生自我评价
2013/10/23 职场文书
小饰品店的创业计划书范文
2013/12/28 职场文书
企业申诉管理制度
2014/01/30 职场文书
幼儿园优秀教师事迹
2014/02/13 职场文书
个人整改方案范文
2014/10/25 职场文书
怎样写辞职信
2015/02/27 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书