|
4 | 4 | "context" |
5 | 5 | "fmt" |
6 | 6 | "os" |
| 7 | + "sync" |
| 8 | + "sync/atomic" |
7 | 9 | "text/tabwriter" |
8 | 10 |
|
9 | 11 | "github.com/spf13/cobra" |
@@ -84,34 +86,54 @@ func runReportsH1(ctx context.Context, fetcher *reports.H1Fetcher, opts reports. |
84 | 86 | return nil |
85 | 87 | } |
86 | 88 |
|
87 | | - // Download mode |
88 | | - var written, skipped, errored int |
| 89 | + // Download mode with worker pool |
| 90 | + var written, skipped, errored atomic.Int32 |
89 | 91 | total := len(summaries) |
90 | 92 |
|
91 | | - for i, s := range summaries { |
92 | | - utils.Log.Infof("[%d/%d] Fetching report %s: %s", i+1, total, s.ID, s.Title) |
93 | | - |
94 | | - report, err := fetcher.FetchReport(ctx, s.ID) |
95 | | - if err != nil { |
96 | | - utils.Log.Warnf("Error fetching report %s: %v", s.ID, err) |
97 | | - errored++ |
98 | | - continue |
99 | | - } |
100 | | - |
101 | | - ok, err := reports.WriteReport(report, opts.OutputDir, opts.Overwrite) |
102 | | - if err != nil { |
103 | | - utils.Log.Warnf("Error writing report %s: %v", s.ID, err) |
104 | | - errored++ |
105 | | - continue |
106 | | - } |
| 93 | + workers := 10 |
| 94 | + if total < workers { |
| 95 | + workers = total |
| 96 | + } |
107 | 97 |
|
108 | | - if ok { |
109 | | - written++ |
110 | | - } else { |
111 | | - skipped++ |
112 | | - } |
| 98 | + jobs := make(chan int, total) |
| 99 | + for i := range summaries { |
| 100 | + jobs <- i |
| 101 | + } |
| 102 | + close(jobs) |
| 103 | + |
| 104 | + var wg sync.WaitGroup |
| 105 | + for w := 0; w < workers; w++ { |
| 106 | + wg.Add(1) |
| 107 | + go func() { |
| 108 | + defer wg.Done() |
| 109 | + for i := range jobs { |
| 110 | + s := summaries[i] |
| 111 | + utils.Log.Infof("[%d/%d] Fetching report %s: %s", i+1, total, s.ID, s.Title) |
| 112 | + |
| 113 | + report, err := fetcher.FetchReport(ctx, s.ID) |
| 114 | + if err != nil { |
| 115 | + utils.Log.Warnf("Error fetching report %s: %v", s.ID, err) |
| 116 | + errored.Add(1) |
| 117 | + continue |
| 118 | + } |
| 119 | + |
| 120 | + ok, err := reports.WriteReport(report, opts.OutputDir, opts.Overwrite) |
| 121 | + if err != nil { |
| 122 | + utils.Log.Warnf("Error writing report %s: %v", s.ID, err) |
| 123 | + errored.Add(1) |
| 124 | + continue |
| 125 | + } |
| 126 | + |
| 127 | + if ok { |
| 128 | + written.Add(1) |
| 129 | + } else { |
| 130 | + skipped.Add(1) |
| 131 | + } |
| 132 | + } |
| 133 | + }() |
113 | 134 | } |
| 135 | + wg.Wait() |
114 | 136 |
|
115 | | - utils.Log.Infof("Done: %d written, %d skipped, %d errors", written, skipped, errored) |
| 137 | + utils.Log.Infof("Done: %d written, %d skipped, %d errors", written.Load(), skipped.Load(), errored.Load()) |
116 | 138 | return nil |
117 | 139 | } |
0 commit comments