【发布时间】:2014-10-22 08:03:16
【问题描述】:
这是一个素数筛的例子
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 打印出来。这行 ch = ch1 是做什么的?
谢谢
【问题讨论】:
-
@VonC 感谢您的链接。引用的文章缺乏postponement 的想法——这是一个中间但重要的改进步骤。另一个重要的优化(实际上与推迟有关)是reducing memory retention,通过打破反馈循环(博客提到)。这使得有可能拥有一个主要生产通道塔,每个通道只有一个小缓冲区(python 版本here - 参见代码中的第 4 行)。
-
@WillNess 乍一看确实不错。