test_timeout.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. return err
  21. }
  22. defer func() {
  23. browser.Close()
  24. println(inData.Index, "browser closed")
  25. }()
  26. page, err := rod_helper.NewPageNavigate(browser, "https://www.baidu.com", 1*time.Second, 5)
  27. if err != nil {
  28. return err
  29. }
  30. page.MustSetUserAgent(&proto.NetworkSetUserAgentOverride{
  31. UserAgent: pkg.RandomUserAgent(true),
  32. })
  33. err = page.WaitLoad()
  34. time.Sleep(6 * time.Second)
  35. return nil
  36. }
  37. antPool, err := ants.NewPoolWithFunc(2, func(inData interface{}) {
  38. data := inData.(InputData)
  39. defer data.Wg.Done()
  40. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  41. defer cancel()
  42. done := make(chan error, 1)
  43. panicChan := make(chan interface{}, 1)
  44. go func() {
  45. defer func() {
  46. if p := recover(); p != nil {
  47. panicChan <- p
  48. }
  49. }()
  50. done <- testFunc(inData)
  51. }()
  52. select {
  53. case err := <-done:
  54. if err != nil {
  55. println("done with Error", err.Error())
  56. }
  57. return
  58. case p := <-panicChan:
  59. println("got panic", p)
  60. case <-ctx.Done():
  61. println("got time out", ctx.Err())
  62. return
  63. }
  64. })
  65. if err != nil {
  66. return err
  67. }
  68. defer antPool.Release()
  69. wg := sync.WaitGroup{}
  70. for i := 0; i < 10; i++ {
  71. wg.Add(1)
  72. err = antPool.Invoke(InputData{Index: i, Wg: &wg})
  73. if err != nil {
  74. println("antPool.Invoke", err)
  75. }
  76. }
  77. wg.Wait()
  78. println("All Done.")
  79. return nil
  80. }
  81. type InputData struct {
  82. Index int
  83. Wg *sync.WaitGroup
  84. }