2016-01-15 51 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