Я новичок в параллелизме в 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 не будут завершены. Судя по тому, что регистрирует, он обрабатывает только по одному за раз. Код может быть найден и выполнен здесь .
Что мне нужно изменить в этом примере, чтобы получить функциональность, описанную выше?