test_timeout.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package TestCode
  2. import (
  3. "github.com/allanpk716/ChineseSubFinder/internal/pkg"
  4. "github.com/allanpk716/ChineseSubFinder/internal/pkg/rod_helper"
  5. "github.com/go-rod/rod/lib/proto"
  6. "github.com/panjf2000/ants/v2"
  7. "golang.org/x/net/context"
  8. "sync"
  9. "time"
  10. )
  11. func DownloadTest() error {
  12. testFunc := func(i interface{}) error {
  13. inData := i.(InputData)
  14. defer func() {
  15. println(inData.Index, "testFunc done.")
  16. }()
  17. println(inData.Index, "start...")
  18. browser, err := rod_helper.NewBrowser("")
  19. if err != nil {
  20. println(inData.Index, "rod_helper.NewBrowser", err)
  21. return err
  22. }
  23. defer func() {
  24. browser.Close()
  25. println(inData.Index, "browser closed")
  26. }()
  27. page, err := rod_helper.NewPageNavigate(browser, "https://www.baidu.com", 10*time.Second, 5)
  28. if err != nil {
  29. return err
  30. }
  31. page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
  32. UserAgent: pkg.RandomUserAgent(true),
  33. })
  34. err = page.WaitLoad()
  35. time.Sleep(10 * time.Second)
  36. return nil
  37. //outDataChan := make(chan int)
  38. //for i := 0; i < 2; i++ {
  39. // go func(in int) {
  40. //
  41. // var outData int
  42. // outData = -1
  43. // defer func() {
  44. // println(inData.Index, in, "go func done")
  45. // outDataChan <- outData
  46. // }()
  47. //
  48. // browser, err := rod_helper.NewBrowser("")
  49. // if err != nil {
  50. // println(inData.Index, in, "rod_helper.NewBrowser", err)
  51. // return
  52. // }
  53. // defer func() {
  54. // browser.Close()
  55. // println(inData.Index, in, "browser closed")
  56. // }()
  57. // page, err := rod_helper.NewPageNavigate(browser, "https://www.baidu.com", 10*time.Second, 5)
  58. // if err != nil {
  59. // return
  60. // }
  61. // page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
  62. // UserAgent: pkg.RandomUserAgent(true),
  63. // })
  64. // err = page.WaitLoad()
  65. // time.Sleep(6 * time.Second)
  66. //
  67. // outData = in
  68. // }(i)
  69. //}
  70. //
  71. //countResult := 0
  72. //for {
  73. // select {
  74. // case <-inData.Ctx.Done():
  75. // // 超时退出
  76. // return nil
  77. // case v, ok := <-outDataChan:
  78. // if ok == true {
  79. // println(inData.Index, "outData ok", v)
  80. // } else {
  81. // println(inData.Index, "outData not ok", v)
  82. // }
  83. // countResult++
  84. // // 跳出,收到够反馈了
  85. // if countResult == 2 {
  86. // return nil
  87. // }
  88. // }
  89. //}
  90. }
  91. antPool, err := ants.NewPoolWithFunc(2, func(inData interface{}) {
  92. data := inData.(InputData)
  93. defer data.Wg.Done()
  94. ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
  95. defer cancel()
  96. data.Ctx = ctx
  97. done := make(chan error, 1)
  98. panicChan := make(chan interface{}, 1)
  99. go func() {
  100. defer func() {
  101. if p := recover(); p != nil {
  102. panicChan <- p
  103. }
  104. }()
  105. done <- testFunc(data)
  106. }()
  107. select {
  108. case err := <-done:
  109. if err != nil {
  110. println("done with Error", err.Error())
  111. }
  112. return
  113. case p := <-panicChan:
  114. println("got panic", p)
  115. case <-ctx.Done():
  116. println("got time out", ctx.Err())
  117. return
  118. }
  119. })
  120. if err != nil {
  121. return err
  122. }
  123. defer antPool.Release()
  124. wg := sync.WaitGroup{}
  125. for i := 0; i < 10; i++ {
  126. wg.Add(1)
  127. err = antPool.Invoke(InputData{Index: i, Wg: &wg})
  128. if err != nil {
  129. println("antPool.Invoke", err)
  130. }
  131. }
  132. wg.Wait()
  133. println("All Done.")
  134. return nil
  135. }
  136. type InputData struct {
  137. Ctx context.Context
  138. Index int
  139. Wg *sync.WaitGroup
  140. }