比如批量群发邮件的功能
因为发送邮件是个比较耗时的操作,
如果是传统的一个个执行 , 总体耗时比较长
可以使用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 , 效果
