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 使用Map实现去重与set的功能操作
Apr 29 Golang
Go 自定义package包设置与导入操作
May 06 Golang
golang 实现并发求和
May 08 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Go Plugins插件的实现方式
Aug 07 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
基于Python实现西西成语接龙小助手
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
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php使用ob_start()实现图片存入变量的方法
2014/11/14 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
PHP常用的小程序代码段
2015/11/14 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
jQuery实现checkbox全选的方法
2015/06/10 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
全面解析Python的While循环语句的使用方法
2015/10/13 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
简单实现python进度条脚本
2017/12/18 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
《值日生》教学反思
2014/02/17 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
小学生评语大全
2014/04/18 职场文书
起诉意见书范文
2015/05/19 职场文书
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js