我正在学习golang协程,我决定创建一个小数据解析器。
首先,假设我们有一个类似于json [{id: 1, data: "text"}, {id: 2, data: "text"}, ...{id: 2000, data: "text"}]
让我们说我们有一个解析数据并将其插入数据库的函数
dataParser(string) error
所以通过运行
for n = 0; n < 2000; n++ {
go dataParser(f[i])
}
我们可以看到数据以随机顺序插入数据库。这是gorouting的基本性质。
但是,让我们说我们有不同类型的数据,其中每个未来的记录可能取决于之前的记录
[{id: 1, data: "text"}, {id: 2, data: @1}, ...{id: 2000, data: @1950}]
其中@<id>
表示我们需要从#id
记录的数据中获取值。
如果我跑的话也是这样做的:
for n = 0; n < 2000; n++ {
go dataParser(f[i])
}
我遇到golang尝试插入数据的情况,该数据在前一条记录中有引用但该记录尚未解析,即golang选择记录2但是第一条记录尚未被解析我得到了空数据
我尝试使用sync.WaitGroup:
for n = 0; n < 2000; n++ {
wg.Add(1)
go func() {
dataParser(f[i])
wg.Wait()
wg.Done()
}()
}
首先 - 感觉很奇怪,因为我不需要在这里使用goroutines
wg.Wait
帮助 - 在golang之前可以在#1之前插入#100记录但是,当我需要知道来自记录#1的数据时,我会进入golang与记录#3一起工作的情况。
所以,我感到困惑。
谢谢你的帮助!
答案 0 :(得分:0)
我不认为这适用于goroutines,因为所有2000个元素都不是独立的,它不可能同时发生。
也许你可以为这个json文件运行一个循环并填充一个地图,你可以从id和数据中检索k-v。
之后,您可以运行dataParser将数据导入数据库。