经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[Go] golang协程池模拟实现群发邮件
来源:cnblogs  作者:陶士涵  时间:2021/5/6 18:01:10  对本文有异议

比如批量群发邮件的功能

因为发送邮件是个比较耗时的操作,

如果是传统的一个个执行 , 总体耗时比较长

可以使用golang实现一个协程池 , 并行发送邮件

pool包下的pool.go文件

  1. package pool
  2. import "log"
  3. //具体任务,可以传参可以自定义操作
  4. type Task struct {
  5. Args interface{}
  6. Do func(interface{})error
  7. }
  8. //协程的个数
  9. var Nums int
  10. //任务通道
  11. var JobChannels =make(chan Task)
  12. //入口的任务通道
  13. var Jobs =make(chan Task)
  14. //执行
  15. func Run(){
  16. for i:=0;i<Nums;i++{
  17. go worker(i)
  18. }
  19. for task:=range Jobs{
  20. JobChannels<-task
  21. }
  22. close(JobChannels)
  23. }
  24. //实际的工作协程worker
  25. func worker(workId int){
  26. for task:=range JobChannels{
  27. ret:=task.Do(task.Args)
  28. log.Printf("worker_id:%d , worker_ret:%v\n",workId,ret)
  29. }
  30. }

具体的使用

test包下的pool_test.go测试文件

  1. package test
  2. import (
  3. "errors"
  4. "gofly/pool"
  5. "log"
  6. "testing"
  7. "time"
  8. )
  9. //真正的模拟发送邮件
  10. func SendEmail(email interface{})error{
  11. log.Println(email," start..")
  12. //模拟耗时
  13. time.Sleep(time.Second*10)
  14. return errors.New(email.(string)+" end..")
  15. }
  16. //获取邮箱并发送
  17. func GetEmails(){
  18. //如果数据量比较大分页获取
  19. page:=1;
  20. for{
  21. //模拟每页获取的邮箱
  22. emails:=[]string{
  23. "1@qq.com",
  24. "2@qq.com",
  25. "3@qq.com",
  26. "4@qq.com",
  27. "5@qq.com",
  28. "6@qq.com",
  29. "7@qq.com",
  30. }
  31. for _,email:=range emails{
  32. var sendEmailTask=pool.Task{
  33. Args: email,
  34. Do: SendEmail,
  35. }
  36. //每个邮箱任务塞入任务通道
  37. pool.Jobs <- sendEmailTask
  38. }
  39. log.Printf("page %d done!\n",page)
  40. page++
  41. }
  42. }
  43. func TestPool(t *testing.T) {
  44. //定义5个协程
  45. pool.Nums = 5
  46. //开个子协程去不停的获取邮箱
  47. go GetEmails()
  48. //执行
  49. pool.Run()
  50. }

 

执行go test -v pool_test.go , 效果

 

原文链接:http://www.cnblogs.com/taoshihan/p/14722053.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号