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:垃圾回收GC触发条件详解
Apr 24 Golang
golang 实现并发求和
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go语言基础知识点介绍
Jul 04 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
使用GO语言实现Mysql数据库CURD的简单示例
Aug 07 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang bufio详细讲解
Apr 21 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Go gorilla/sessions库安装使用
Aug 14 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
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
JS实现slide文字框缩放伸展效果代码
2015/11/05 Javascript
javascript动态获取登录时间和在线时长
2016/02/25 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
Python代码调试的几种方法总结
2015/04/15 Python
Python常用算法学习基础教程
2017/04/13 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
HTML5实现表单自动验证功能实例代码
2017/01/11 HTML / CSS
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
土木工程应届生自荐信
2013/09/24 职场文书
应届毕业生求职信
2013/11/30 职场文书
中学生期末评语
2014/02/03 职场文书
消防宣传口号
2014/06/16 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
关于运动会的广播稿
2014/09/22 职场文书
关于颐和园的导游词
2015/01/30 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技