Skip to content

Commit a83a241

Browse files
committed
parallelize H1 report fetching with 10 workers
1 parent 3a856a0 commit a83a241

1 file changed

Lines changed: 46 additions & 24 deletions

File tree

cmd/reports_h1.go

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"fmt"
66
"os"
7+
"sync"
8+
"sync/atomic"
79
"text/tabwriter"
810

911
"github.com/spf13/cobra"
@@ -84,34 +86,54 @@ func runReportsH1(ctx context.Context, fetcher *reports.H1Fetcher, opts reports.
8486
return nil
8587
}
8688

87-
// Download mode
88-
var written, skipped, errored int
89+
// Download mode with worker pool
90+
var written, skipped, errored atomic.Int32
8991
total := len(summaries)
9092

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+
}
10797

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+
}()
113134
}
135+
wg.Wait()
114136

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())
116138
return nil
117139
}

0 commit comments

Comments
 (0)