V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  xurh  ›  全部回复第 1 页 / 共 1 页
回复总数  1
2023-05-09 11:03:17 +08:00
回复了 swqslwl 创建的主题 Go 编程语言 请教一个并发设计问题
我之前做爬虫收集数据也遇到过类似的问题,把数据聚合进行批量插入减少 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()
}
}
}
}

```
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2871 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 9ms · UTC 12:18 · PVG 20:18 · LAX 04:18 · JFK 07:18
Developed with CodeLauncher
♥ Do have faith in what you're doing.