比如批量群发邮件的功能
因为发送邮件是个比较耗时的操作,
如果是传统的一个个执行 , 总体耗时比较长
可以使用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;iNums;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 40行代码实现通用协程池
- GO实现协程池管理的方法