csp 素数筛选 - (sunznx) 振翅飞翔
13 June 2020

Lab: Xv6 and Unix utilities
Bell Labs and CSP Threads
从并发模型看 Go 的语言设计

实现两个函数:start 和 filter
start 函数接收一组输入,这些输入的第一个值是素数 x,然后将 x 和 剩下的输入转移给 filter 函数
filter 函数接收来自 start 函数的输入,过滤掉能被 x 整除的数。将剩余的不能被 x 整除的数,作为 新的 start 函数的输入参数

func start(in chan int, out chan int) {
        x := <-in
        out <- x
        filter(x, in, out)
}

func filter(x int, in chan int, out chan int) {
        newIn := make(chan int)
        go start(newIn, out)
        for v := range in {
                if v%x != 0 {
                        newIn <- v
                }
        }
}

func main() {
        in := make(chan int)
        out := make(chan int)

        go start(in, out)

        go func() {
                for x := 2; x <= 31; x++ {
                        in <- x
                }
        }()

        for v := range out {
                fmt.Printf("%v\n", v)
                if v >= 31 {
                        return
                }
        }
}