如何正确使用通道来控制并发?

时间:2018-05-10 23:01:05

标签: go concurrency

我是Go的并发新手,我正试图弄清楚如何使用通道来控制并发性。我想做的是有一个循环,我可以使用一个新的go例程调用一个函数,并在该函数处理时继续循环,我想限制运行到3的例程的数量。我的第一次尝试这样做是下面的代码:

func write(val int, ch chan bool) {
    fmt.Println("Processing:", val)
    time.Sleep(2 * time.Second)
    ch <- val % 3 == 0
}

func main() {
    ch := make(chan bool, 3) // limit to 3 routines?
    for i := 0; i< 10; i++ {
        go write(i, ch)
        resp := <- ch
        fmt.Println("Divisible by 3:", resp)
    }
    time.Sleep(20 * time.Second)
}

我的印象是,这基本上会一次调用write 3,然后继续处理下一个3,直到前3个完成。根据记录的内容,它似乎只是一次处理一个。代码可以是found and executed here

在此示例中,我需要更改哪些内容才能获得上述功能?

0 个答案:

没有答案