golang 线程池下载

前端之家收集整理的这篇文章主要介绍了golang 线程池下载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. type GoroutinePool struct {
  2. 2 Queue chan func() error
  3. 3 Number int
  4. 4 Total int
  5. 5
  6. 6 result chan error
  7. 7 finishCallback func()
  8. 8 }
  9. 9
  10. 10 // 初始化
  11. 11 func (self *GoroutinePool) Init(number int,total int) {
  12. 12 self.Queue = make(chan func() error,total)
  13. 13 self.Number = number
  14. 14 self.Total = total
  15. 15 self.result = make(chan error,total)
  16. 16 }
  17. 17
  18. 18 // 开门接客
  19. 19 func (self *GoroutinePool) Start() {
  20. 20 // 开启Number个goroutine
  21. 21 for i := 0; i < self.Number; i++ {
  22. 22 go func() {
  23. 23 for {
  24. 24 task,ok := <-self.Queue
  25. 25 if !ok {
  26. 26 break
  27. 27 }
  28. 28
  29. 29 err := task()
  30. 30 self.result <- err
  31. 31 }
  32. 32 }()
  33. 33 }
  34. 34
  35. 35 // 获得每个work的执行结果
  36. 36 for j := 0; j < self.Total; j++ {
  37. 37 res,ok := <-self.result
  38. 38 if !ok {
  39. 39 break
  40. 40 }
  41. 41
  42. 42 if res != nil {
  43. 43 fmt.Println(res)
  44. 44 }
  45. 45 }
  46. 46
  47. 47 // 所有任务都执行完成,回调函数
  48. 48 if self.finishCallback != nil {
  49. 49 self.finishCallback()
  50. 50 }
  51. 51 }
  52. 52
  53. 53 // 关门送客
  54. 54 func (self *GoroutinePool) Stop() {
  55. 55 close(self.Queue)
  56. 56 close(self.result)
  57. 57 }
  58. 58
  59. 59 // 添加任务
  60. 60 func (self *GoroutinePool) AddTask(task func() error) {
  61. 61 self.Queue <- task
  62. 62 }
  63. 63
  64. 64 // 设置结束回调
  65. 65 func (self *GoroutinePool) SetFinishCallback(callback func()) {
  66. 66 self.finishCallback = callback
  67. 67 }
  68.  
  69. 开启3个线程,下载10文件的测试代码
  70.  
  71. 1 func Download_test() {
  72. 2 urls := []string{
  73. 3 "http://dlsw.baidu.com/sw-search-sp/soft/44/17448/Baidusd_Setup_4.2.0.7666.1436769697.exe",4 "http://dlsw.baidu.com/sw-search-sp/soft/3a/12350/QQ_V7.4.15197.0_setup.1436951158.exe",5 "http://dlsw.baidu.com/sw-search-sp/soft/9d/14744/ChromeStandalone_V43.0.2357.134_Setup.1436927123.exe",6 "http://dlsw.baidu.com/sw-search-sp/soft/6f/15752/iTunes_V12.2.1.16_Setup.1436855012.exe",7 "http://dlsw.baidu.com/sw-search-sp/soft/70/17456/BaiduAn_Setup_5.0.0.6747.1435912002.exe",8 "http://dlsw.baidu.com/sw-search-sp/soft/40/12856/QIYImedia_1_06_v4.0.0.32.1437470004.exe",9 "http://dlsw.baidu.com/sw-search-sp/soft/42/37473/BaiduSoftMgr_Setup_7.0.0.1274.1436770136.exe",10 "http://dlsw.baidu.com/sw-search-sp/soft/49/16988/YoudaoNote_V4.1.0.300_setup.1429669613.exe",11 "http://dlsw.baidu.com/sw-search-sp/soft/55/11339/bdbrowserSetup-7.6.100.2089-1212_11000003.1437029629.exe",12 "http://dlsw.baidu.com/sw-search-sp/soft/53/21734/91zhushoupc_Windows_V5.7.0.1633.1436844901.exe",13 }
  74. 14
  75. 15 pool := new(GoroutinePool)
  76. 16 pool.Init(3,len(urls))
  77. 17
  78. 18 for i := range urls {
  79. 19 url := urls[i]
  80. 20 pool.AddTask(func() error {
  81. 21 return download(url)
  82. 22 })
  83. 23 }
  84. 24
  85. 25 isFinish := false
  86. 26
  87. 27 pool.SetFinishCallback(func() {
  88. 28 func(isFinish *bool) {
  89. 29 *isFinish = true
  90. 30 }(&isFinish)
  91. 31 })
  92. 32
  93. 33 pool.Start()
  94. 34
  95. 35 for !isFinish {
  96. 36 time.Sleep(time.Millisecond * 100)
  97. 37 }
  98. 38
  99. 39 pool.Stop()
  100. 40 fmt.Println("所有操作已完成!")
  101. 41 }
  102. 42
  103. 43 func download(url string) error {
  104. 44 fmt.Println("开始下载... ",url)
  105. 45
  106. 46 sp := strings.Split(url,"/")
  107. 47 filename := sp[len(sp)-1]
  108. 48
  109. 49 file,err := os.Create("/Users/staff/Documents/Red_Test/AAAA/" + filename)
  110. 50 if err != nil {
  111. 51 return err
  112. 52 }
  113. 53
  114. 54 res,err := http.Get(url)
  115. 55 if err != nil {
  116. 56 return err
  117. 57 }
  118. 58
  119. 59 length,err := io.Copy(file,res.Body)
  120. 60 if err != nil {
  121. 61 return err
  122. 62 }
  123. 63
  124. 64 fmt.Println("## 下载完成! ",url," 文件长度:",length)
  125. 65 return nil
  126. 66 }

猜你在找的Go相关文章