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 实现两个结构体复制字段
Apr 28 Golang
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
May 05 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang 实现并发求和
May 08 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang实现可重入锁的示例代码
May 25 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go结合Gin导出Mysql数据到Excel表格
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
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
jQuery 前的按键判断代码
2010/03/19 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
apache部署python程序出现503错误的解决方法
2017/07/24 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Python ellipsis 的用法详解
2020/11/20 Python
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
2013/08/11 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
校三好学生主要事迹
2014/01/11 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
员工生日会策划方案
2014/06/14 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
当幸福来敲门英文观后感
2015/06/01 职场文书
小学生暑假安全公约
2015/07/14 职场文书
早上好问候语大全
2015/11/10 职场文书