2016-12-20 10 views
-2

次のコードがあります。私はgo func() {}()部分を除去し、ちょうどそれの間でコードを残す場合は罰金を実行するようだが、私は戻って、それが実行されないことを追加した瞬間Goルーチンで匿名関数が実行されないようです

func saveMatterNodes(matterId int, nodes []doculaw.LitigationNode) (bool, error) { 

    var (
     err error 
     resp *http.Response 
    ) 

    // Do this in multiple threads 
    for _, node := range nodes { 
     fmt.Println("in loops") 
     go func() { 
      postValues := doculaw.LitigationNode{ 
       Name:  node.Name, 
       Description: node.Description, 
       Days:  node.Days, 
       Date:  node.Date, 
       IsFinalStep: false, 
       Completed: false, 
       Matter:  matterId} 

      b := new(bytes.Buffer) 
      json.NewEncoder(b).Encode(postValues) 
      resp, err = http.Post("http://127.0.0.1:8001/matterNode/", "application/json", b) 
      io.Copy(os.Stdout, resp.Body) 

      fmt.Println("Respone from http post", resp) 
      if err != nil { 
       fmt.Println(err) 
      } 
     }() 

    } 

    if err != nil { 
     return false, err 
    } else { 
     return true, nil 
    } 

} 

:無名関数に特別な注意を払ってください。それがどんなアイデアなのか?私は当初、別のスレッドで実行していると考えていたかもしれませんが、Webサービスのアクセスログには実行されていないことがわかります。

答えて

4

この現象は、関数がメインスレッドに戻ることはないと考えています(goroutinesを起動した後は、プログラムが終了して作業を完了するのを待っています)。 チャネル、IO操作、sync.WaitGroupなどを使用すると、メインスレッドに制御を戻すことができます。

あなたはsync.WaitGroup

を試してみたいことがあります。例:https://play.golang.org/p/Zwn0YBynl2

+0

はい!もちろん:-)ありがとう@Pradip –

関連する問題