我之前做爬虫收集数据也遇到过类似的问题,把数据聚合进行批量插入减少 io 。
我采用的 chan ,然后启动一个协程监听 chan ,当收集一定数量的数据或者时间满足,就把数据写入 db
```go
type DBWriter[T any] struct {
Size int
Interval time.Duration
done chan struct{}
ch chan T
insertDB func([]T, int)
}
func (w *DBWriter[T]) Start() {
ticker := time.NewTicker(w.Interval)
records := make([]T, 0, w.Size)
insert := func() {
if len(records) == 0 {
return
}
w.insertDB(records, w.Size)
records = make([]T, 0, w.Size)
}
for {
select {
case <-w.done:
insert()
return
case <-ticker.C:
insert()
case data := <-
w.ch:
records = append(records, data)
if len(records) == w.Size {
insert()
}
}
}
}
```