2017-05-06 4 views
-1

私はゴルーチンがforループで実行されている:「眠っている」すべてのゴルーチンを閉じるにはどうしたらいいですか?

func main(){ 
      for _, i := range x{ 
       go httpRequests(i, ch) 
      } 

      for i := range ch{ 
       print i 

     } 
    } 

func httpRequests(i, ch){ 
      for _, x := range y{ 
       go func(string x){ 
        do something with i 
        ch <- result 
       }(x) 
      } 


      } 

私がいることを実行し、それはすべてのゴルーチンが眠っていると言います。助言がありますか?

+0

あなたは、実際のコードを表示しなければなりません。 – Volker

+0

私は上記のリンクのサンプルコードは私を始めさせるのに十分だと思います。そのコードを実行すると、同じ出力が印刷されていることがわかります。私が欲しいのは、IDを繰り返してすべてを印刷することです – shishh03

+1

私はこのコードをデバッグする時間がありませんが、この文書全体を読むことをお勧めします: https://github.com/golang/go/wiki/ CommonMistakes#goroutines-on-loop-iterator-variables –

答えて

2

3つのゴルーチン(go serviceReq(i, httpCh))がチャンネルを通過し始めました。そして、あなたはそのチャンネルでを一度だけ受信します。ch := (<-httpCh).serviceData)。代わりにあなたがループ内で受信しなければならないの

for resp := range httpCh { 
    output = append(output, resp.serviceData) 
} 
+0

ありがとう、それは意味があります、今私は "すべてのgoroutinesが眠っているデッドロックです"に固執しています。私はウェイトグループを追加しようとしていましたが、チャンネルを閉じることはできましたが遠くには行きませんでした。助言がありますか? – shishh03

関連する問題