2017-08-07 10 views
1

私はgoogle apiに基づいてGmailクライアントを開発しています。ゴルーチンを制限する方法

は、私はより強力にループを処理したいすべてのラベルのために私は詳細

for _, l := range r.Labels { 
    d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do() 
} 

を取得する必要があり、

r, err := s.gClient.Service.Users.Labels.List(s.gClient.User).Do() 

次に、この呼び出しによって得られたラベルのリストを持っていますループ内にゴルーチンを実装しました。

ch := make(chan label.Label) 

for _, l := range r.Labels { 

    go func(gmailLabels *gmailclient.Label, gClient *gmail.Client, ch chan<- label.Label) { 

     d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do() 

     if err != nil { 
      panic(err) 
     } 

     // Performs some operation with the label `d` 
     preparedLabel := .... 

     ch <- preparedLabel 

    }(l, s.gClient, ch) 
} 

for i := 0; i < len(r.Labels); i++ { 
    lab := <-ch 
    fmt.Printf("Processed %v\n", lab.LabelID) 
} 

このコードの問題は、gm ail apiにレート制限があるため、このエラーが発生します:

panic: googleapi: Error 429: Too many concurrent requests for user, rateLimitExceeded 

この状況を処理する正しい方法は何ですか?

答えて

1

10個のゴルーチンを呼び出し、別のゴールーチンで1つのforループから値を渡します。チャネルには、同期時間を短縮するための小さなバッファがあります。

chIn := make(chan label.Label, 20) 
chOut := make(chan label.Label, 20) 

for i:=0;i<10;i++ { 
    go func(gClient *gmail.Client, chIn chan label.Label, chOut chan<- label.Label) { 

     for gmailLabels := range chIn { 
      d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do() 

      if err != nil { 
       panic(err) 
      } 

      // Performs some operation with the label `d` 
      preparedLabel := .... 

      chOut <- preparedLabel 

     } 

    }(s.gClient, chIn, chOut) 

} 

go func(chIn chan label.Label) { 
    defer close(chIn) 
    for _, l := range r.Labels { 
     chIn <- l 
    } 
}(chIn) 

for i := 0; i < len(r.Labels); i++ { 
    lab := <-chOut 
    fmt.Printf("Processed %v\n", lab.LabelID) 
} 

編集:ここではplayground sample

+0

ありがとう、私はどのように先に進むことができるのか分からない...プログラム、ブロック10ラベルを精緻化した後ブロック – matiux

+0

Ops申し訳ありませんが、私は "for gmailLabels:= range chIn {"最初のgoroutine 。 パニック:ランタイムエラー:インデックスが範囲外です[回復] \tパニック:ランタイムエラー:インデックスが範囲外です – matiux

+0

エラーが発生するのはどのラインですか?あなたがここに投稿していないコードでなければならない... – TehSphinX

関連する問題