2016-01-15 50 views
0

我是新來golang,我疑惑這個僵局(run here去例行死鎖?

package main 

import (
    "fmt" 
    "runtime" 
    "time" 
) 

func main() { 
    c := make(chan string) 
    work := make(chan int, 1) 
    clvl := runtime.NumCPU() 
    count := 0 
    for i := 0; i < clvl; i++ { 
     go func(i int) { 
      for jdId := range work { 
       time.Sleep(time.Second * 1) 
       c <- fmt.Sprintf("done %d", jdId) 
      } 
     }(i) 
    } 

    go func() { 
     for i := 0; i < 10; i++ { 
      work <- i 
     } 

     close(work) 
    }() 

    for resp := range c { 
     fmt.Println(resp, count) 
     count += 1 
    } 
} 

回答

2

你從來沒有接近c,所以你for range循環將永遠等待。關閉它是這樣的:

var wg sync.WaitGroup 
for i := 0; i < clvl; i++ { 
    wg.Add(1) 
    go func(i int) { 
     defer wg.Done() 
     for jdId := range work { 
      time.Sleep(time.Second * 1) 
      c <- fmt.Sprintf("done %d", jdId) 
     } 
    }(i) 
} 

go func() { 
    for i := 0; i < 10; i++ { 
     work <- i 
    } 

    close(work) 
    wg.Wait() 
    close(c) 
}() 

編輯:修正了恐慌,感謝Crast

+0

這將導致恐慌,因爲他產生多個工人夠程 - 他們都將嘗試關閉C – Crast

+0

哦,親愛的,當然會,謝謝! – mrd0ll4r