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语言操作数据库及其常规操作的示例代码
Apr 21 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go Plugins插件的实现方式
Aug 07 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 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学习之 循环结构实现代码
2011/06/09 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
深入理解AngularJs-scope的脏检查(一)
2017/06/19 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
Python实现的最近最少使用算法
2015/07/10 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python使用tornado实现简单爬虫
2018/07/28 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
初婚初育证明范本
2014/11/24 职场文书
西安兵马俑导游词
2015/02/02 职场文书
客房领班岗位职责
2015/02/11 职场文书
个人学习总结范文
2015/02/15 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
商务信函英语问候语
2015/11/10 职场文书