2016-12-20 60 views
-2

我有以下代碼。要特別注意的匿名函數:匿名函數似乎不在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 
    } 

} 

如果我刪除go func() {}()部分和剛剛離開的代碼之間似乎執行罰款,但我添加的那一刻回到它不執行。任何想法,爲什麼?我最初以爲也許是因爲它在不同的線程上執行,但這似乎並不是這種情況,因爲我可以在我的web服務訪問日誌中看到它未執行。

回答

4

我認爲這種行爲是因爲函數永遠不會退回到主線程(啓動goroutines後,程序中沒有構造來等待它們完成工作)。 使用通道,IO操作,sync.WaitGroup等可以控制回主線程。

你可能想嘗試sync.WaitGroup

例子:https://play.golang.org/p/Zwn0YBynl2

+0

是的!當然:-)謝謝@Pradip –