比如批量群发邮件的功能
因为发送邮件是个比较耗时的操作,
如果是传统的一个个执行 , 总体耗时比较长
可以使用golang实现一个协程池 , 并行发送邮件
pool包下的pool.go文件
package poolimport "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 , 效果