使用Go和Waitgroups并行获取数据

时间:2017-04-27 12:45:47

标签: go parallel-processing

我有一个查询API的方法,可以使用或不使用过滤器获取不同日期范围的数据。

func getTopData(country string, startDate time.Time, endDate time.Time, filterID uint) (result map[string][10]topResult) {
    response := getRequest(fmt.Sprintf("%s/top/%s/%s-%s/filterid:%d/10",
        cfg.API.URI,
        country,
        startDate.Format("20060102"),
        endDate.Format("20060102"),
        filterID))

    json.Unmarshal(response, &result)
    return
}

每次通话都需要大约一分钟才能完成,我需要使用不同的参数调用该方法六次(对于过去三个月中的每一个都没有过滤器,过去三个月每次都有过滤器)。

所以现在我有这样的事情:

var topData [6]map[string][10]topResult
topData[0] = getTopData(country, firstMonthStart, firstMonthEnd, 0)
topData[1] = getTopData(country, secondMonthStart, secondMonthEnd, 0)
topData[2] = getTopData(country, thirdMonthStart, thirdMonthEnd, 0)
topData[3] = getTopData(country, firstMonthStart, firstMonthEnd, filterID)
topData[4] = getTopData(country, secondMonthStart, secondMonthEnd, filterID)
topData[5] = getTopData(country, thirdMonthStart, thirdMonthEnd, filterID)

这样,数据一个接一个地填充。如何在保持topData数组中结果的顺序的同时并行进行调用(以便索引0处的数据是第一个月没有过滤器,索引4处的数据是第二个月,过滤器等)?

我在考虑使用WaitGroup,但我不确定如何处理实际的结果数据。 :(

因此,首先要将wg *sync.WaitGroup作为参数添加到getTopData函数中。在里面我做wg.Add(1)defer wg.Done()。在函数外部,我var wg sync.WaitGroup并将&wg传递给getTopData,进行六次调用,然后wg.Wait()。但是,如何将结果分配给topData[0]topData[1]等?

1 个答案:

答案 0 :(得分:0)

我继续做了以下更改:

  1. getTopData有一个参数result *map[string][30]topResult
  2. 我删除了getTopData
  3. 的返回类型
  4. 我打电话getTopData六次,并将&topData[0]&topData[1]等作为参数传递