私は、APIを照会して、フィルターの有無にかかわらずさまざまな日付範囲のデータを取得するメソッドを持っています。GoとWaitgroupを使用してデータを並列に取得する
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
}
各呼び出しが終了する約1分かかりますし、私は(フィルタとフィルタなしの最後の3ヶ月のそれぞれと最後の3ヶ月ごとに)異なるパラメータを持つメソッドを6回呼び出す必要があります。データが次々に満たされ、これにより
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のデータはフィルタ付きの2番目の月です。 )?
私はWaitGroupを使用することを考えていましたが、実際の結果データをどのように処理するかは本当にわかりません。 :(
だから、最初はgetTopData
関数にパラメータとしてwg *sync.WaitGroup
を追加することになる。私はwg.Add(1)
とdefer wg.Done()
を行う内部。関数の外で、私はvar wg sync.WaitGroup
を行うと、getTopData
に&wg
を渡し、私の6つの呼、その後wg.Wait()
を行います。しかし、私は次の変更を先に行って、どうやったのか、私はなど、topData[1]
、topData[0]
に結果を割り当てない
実行]を
getTopData
6回を呼び出し、&topData[0]
渡していgetTopData
'wget.Add(1)'は 'getTopData'の内部で呼び出され、その直後に私は' func(){...}() 'を実行しているので、作業を行っている' getTopData'の実際のボディはその 'func'の中に。 – smares
OK、WaitGroupの使用方法は正しいとは言えますが、同時読み取り/書き込みを確認します。あなたがそこにミューテックスを必要としているか、チャンネル上で値を送る必要があるように思えます。 – JimB