如果下一条记录依赖于之前的记录,我可以使用gorouting吗?如果是的话怎么样?

时间:2018-03-06 01:38:22

标签: go goroutine

我正在学习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一起工作的情况。

所以,我感到困惑。

  • 在这里使用goroutines是个好主意吗?
  • 即使没有 - 这样的情况有解决方案吗?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

我不认为这适用于goroutines,因为所有2000个元素都不是独立的,它不可能同时发生。

也许你可以为这个json文件运行一个循环并填充一个地图,你可以从id和数据中检索k-v。

之后,您可以运行dataParser将数据导入数据库。