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
golang判断key是否在map中的代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
Go使用协程交替打印字符
Apr 29 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
Golang: 内建容器的用法
May 05 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go调用Rust方法及外部函数接口前置
Jun 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
PHP新手上路(十三)
2006/10/09 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
JS对象与json字符串格式转换实例
2014/10/28 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
jQuery插件expander实现图片翻转特效
2015/05/21 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
JavaScript实现抖音罗盘时钟
2019/10/11 Javascript
详解Webpack4多页应用打包方案
2020/07/16 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
Python中的面向对象编程详解(上)
2015/04/13 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
应届生服务员求职信
2013/10/31 职场文书
仓管岗位职责范本
2014/02/08 职场文书
工程安全生产协议书
2014/11/21 职场文书
大学军训决心书
2015/02/05 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书