[Go] golang协程池模拟实现群发邮件
比如批量群发邮件的功能
因为发送邮件是个比较耗时的操作,
如果是传统的一个个执行 , 总体耗时比较长
可以使用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+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网