2017-04-27 7 views
-2

私は、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]に結果を割り当てない

答えて

0

:?

  1. getTopDataは、パラメータを持っていますあなたが同じを変更することはできません -
  2. 210は、私は、パラメータとしてなど、&topData[1]、レース検出器を
+0

実行]をgetTopData 6回を呼び出し、&topData[0]渡していgetTopData

  • の戻り値の型を削除しました複数のゴルーチンから同時にデータ構造を作成できます。マップ値全体を置き換えたい場合を除き、マップへのポインタは必要ありません。上では、関数内で 'wg.Add(1)'を呼び出していることにも言及していますが、これは間違っています。ゴルーチンをディスパッチする前に、必ず待機グループに追加する必要があります。いくつかの並行処理の例とドキュメントを見直すと役に立つかもしれません。 – JimB

  • +0

    'wget.Add(1)'は 'getTopData'の内部で呼び出され、その直後に私は' func(){...}() 'を実行しているので、作業を行っている' getTopData'の実際のボディはその 'func'の中に。 – smares

    +0

    OK、WaitGroupの使用方法は正しいとは言えますが、同時読み取り/書き込みを確認します。あなたがそこにミューテックスを必要としているか、チャンネル上で値を送る必要があるように思えます。 – JimB

    関連する問題