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 interface判断为空nil的实现代码
Apr 24 Golang
go:垃圾回收GC触发条件详解
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go 实现英尺和米的简单单位换算方式
Apr 29 Golang
解决Go gorm踩过的坑
Apr 30 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go 语言结构实例分析
Jul 04 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Golang gRPC HTTP协议转换示例
Jun 16 Golang
在ubuntu下安装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模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php无限极分类实现方法分析
2019/07/04 PHP
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
jQuery实现鼠标滑过点击事件音效试听
2015/08/31 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
2016/07/22 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
layui表格实现代码
2017/05/20 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
layui监听工具栏的实例(操作列表按钮)
2019/09/10 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
简单了解Django模板的使用
2017/12/20 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
后勤主管工作职责
2013/12/07 职场文书
高中毕业自我鉴定
2013/12/16 职场文书
运动会获奖感言
2014/02/11 职场文书
中学校庆方案
2014/03/17 职场文书
小学开学典礼主持词
2014/03/19 职场文书
品牌转让协议书
2014/08/20 职场文书
单位委托书怎么写
2014/09/21 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
单位车辆管理制度
2015/08/05 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android