test_timeout.go 3.6 KB

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