[Go] golang协程池模拟实现群发邮件
2023-02-18 15:37:13 时间
比如批量群发邮件的功能
因为发送邮件是个比较耗时的操作,
如果是传统的一个个执行 , 总体耗时比较长
可以使用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 , 效果
相关文章
- [Linux] SSH隧道本地端口转发访问远程服务中的数据库
- [Linux] 纯净ubuntu系统仓库更换为阿里云的源
- [Linux] deepin系统添加PHP仓库源出错Error: could not find a distribution template for Deepin/stable
- [视频教程] 如何在Linux深度系统deepin下安装docker
- [GO] golang happen before 的保证原则
- [Go] Go中的channel特性
- [Go] Go中延迟语句defer的注意事项
- [Go] GO数据类型分类
- [Go] go常量中的无类型常量
- [Go] GO中的字符串底层数据结构
- [Go] Slice的底层自动扩容
- [Linux] ls命令的几个常用参数实现按时间/文件大小排序
- [Go] 在gin框架gorm下查询一对多的数据
- [GO]go redis实现滑动窗口限流-redis版
- [Go]GO实现滑动窗口限流算法-单机版
- [Linux] 磁盘IO性能查看和优化以及iostat命令
- 理论+实例,带你掌握Linux的页目录和页表
- 聊一聊物联网嵌入式芯片的内容结构
- [Linux] 编写Dockerfile文件自动构建镜像
- [TCP] 单台linux服务器最多支撑的tcp最大连接数