Это является примером простого числа просеятьКак работают каналы в этом примере?
package main
func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i
}
}
func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}
func main() {
ch := make(chan int)
go Generate(ch)
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}
То, что я понимаю, эта строка кода
prime := <-ch
канал ждет ввода и назначает премьер. Итак, почему же все числа не печатаются, когда следующий оператор называется
print(prime, "\n")
Если удалить эти последние 3 строки
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
тогда все числа напечатанных от 2 до 11. Что делает эту линию do ch = ch1?
Благодаря
Контекст: http://golang.org/doc/play/sieve.go. Также оптимизирован в http://blog.onideas.ws/eratosthenes.go – VonC
@ VonC благодарит за ссылку.в цитированной статье отсутствует идея «отсрочки» (http://stackoverflow.com/a/8871918/849891) - промежуточного, но значимого шага улучшения. Другая важная оптимизация (связанная с отсрочкой, на самом деле) - [сокращение хранения памяти] (http://stackoverflow.com/a/13895347/849891), открывая цикл обратной связи (что упоминается в блоге). Это позволяет иметь башню первичных каналов, каждая с небольшим буфером (версия python [здесь] (http://stackoverflow.com/a/10733621/849891) - см. Четвертую строку в коде). –
@WillNess выглядит действительно на первый взгляд. – VonC