缓存channel使用for-range?

bvaccc · · 1597 次点击
看了下你的代码,我觉得你的代码的意图是,创建一个bool的chan 每个线程结束通知这个通道。 然后再通过遍历这个通道来达到等待所有线程都执行结束的目的。 但是完全不需要用到通道。直接用WaitGroup就行了。 不知道你是否这个意图。至少你代码展现是这个意图。 以下使用WaitGroup的例子。 package main import ( "fmt" "sync" ) func main() { //如果想用和cpu同等数量的线程,这句根本不需要,go默认就是。 //runtime.GOMAXPROCS(runtime.NumCPU()) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go Go(&wg, i) } wg.Wait() } func Go(wg *sync.WaitGroup, index int) { //defer 的作用不单单是结束才运行,它是保证函数出错了也运行的机制。 //但对性能有影响,如果这函数永远不会发生运行时错误,最好加到末尾。 defer wg.Done() a := 0 for i := 0; i < 10000000; i++ { a += i } fmt.Println(index, a) //wg.Done() }
#9
更多评论
stevewang
耶和华是我的牧者,我必不至缺乏。
这里不适合用range,因为需要配合close,但是找不到合适的地方去close channel
#1
package main import ( "fmt" "runtime" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) cs := make([]chan bool, 10) for i := 0; i < 10; i++ { cs[i] = make(chan bool, 1) go Go(cs[i], i) } for _, c := range cs { <-c } } func Go(c chan bool, index int) { a := 0 for i := 0; i < 10000000; i++ { a += i } fmt.Println(index, a) c <- true } 改成slice试试?
#2