通道如何使用通道查找素数问题?
Posted
技术标签:
【中文标题】通道如何使用通道查找素数问题?【英文标题】:How channel work in using channel to find prime number problem? 【发布时间】:2021-03-25 00:00:18 【问题描述】:我有一种方法可以像这样使用 Go 解决查找素数问题:
package main
import (
"fmt"
)
// Generate natural seri number: 2,3,4,...
func GenerateNatural() chan int
ch := make(chan int)
go func()
for i := 2; ; i++
ch <- i
()
return ch
// Filter: delete the number which is divisible by a prime number to find prime number
func PrimeFilter(in <-chan int, prime int) chan int
out := make(chan int)
go func()
for
if i := <-in; i%prime != 0
out <- i
()
return out
func main()
ch := GenerateNatural()
for i := 0; i < 100; i++
prime := <-ch
fmt.Printf("%v: %v\n", i+1, prime)
ch = PrimeFilter(ch, prime)
我不知道这种方法会发生什么:
知道不能不中断打印频道内容:Can not print content of channel 通道大小:默认缓冲区通道大小为1
,即:
默认情况下,通道是无缓冲的,这表明它们只会 如果有相应的接收 (
我无法想象上面的 Go 程序是如何运行的!
有人可以帮我看看上面围棋程序的前10个数字的分步流程吗?
【问题讨论】:
我不明白你的问题。您是否要求某人与您一起逐步完成此代码并解释每一行? @Flimzy 不,我了解主要目的和功能,但我无法想象无缓冲通道如何发送和接收哪个值(go 例程未按顺序运行)。 GenerateNatural 和 PrimeFilter 都启动了并发运行的 goroutine,一个发送,一个接收,主 goroutine 也在运行。请注意,这是一个非常复杂的示例,它有助于使用纸和铅笔查看发生了什么。 这是一个相当复杂的例子。在这两个函数中,go func()...()
创建了一个匿名 goroutine 并异步运行它,然后返回通道。 PrimeFilter
返回一个通道,该通道将接收不能被某个候选者整除的数字。由于ch = PrimeFilter(ch, prime)
在每次迭代中都将新的通道实例分配给ch
,这也意味着prime := <-ch
每次总是从不同的通道中读取第一个值。
ch = PrimeFilter(ch, prime)
@Groo 你是对的,这就是为什么即使我打印 i (迭代器)也无法对流程进行成像
【参考方案1】:
这是一个相当复杂的例子。在这两个函数中,go func()...()
创建了一个匿名 goroutine 并异步运行它,然后返回将从 goroutine 接收值的通道。 PrimeFilter
返回一个通道,该通道将接收不能被某个候选者整除的数字。
这个想法是prime := <-ch
总是从通道中获取第一个元素。因此,可视化流程:
GenerateNatural()
首先发送数字 2、3、4... 到 ch
。
第一次循环迭代:
一个。 prime := <-ch
读取第一个(质数)数字2
。
b. PrimeFilter(ch, 2)
然后继续接收其余数字(3
、4
、5
、...),并将不能被 2
整除的数字发送到输出通道。因此,PrimeFilter(ch, 2)
返回的频道将收到数字(3
、5
、7
、...)。
c。主函数中的ch = PrimeFilter(ch, prime)
现在替换本地ch
变量为上一步中PrimeFilter(ch, 2)
的输出。
第二次循环迭代:
一个。 prime := <-ch
从当前 ch
实例中读取第一个(质数)数字(第一个数字是 3
)。
b. PrimeFilter(ch, 3)
然后继续接收(已经过滤的)数字,除了第一个数字(所以,5
,7
,9
,...),并将不能被 3
整除的数字发送到输出渠道。因此,PrimeFilter(ch, 2)
返回的频道将收到数字5
、7
、11
、...,因为9
可以被3
整除。
c。主函数中的ch = PrimeFilter(ch, prime)
现在替换本地ch
变量为上一步中PrimeFilter(ch, 3)
的输出。
...
【讨论】:
所以,Go 主程序会在每次迭代后替换 ch 通道,并且不会关闭任何通道,对吧?在您说明了一些步骤之后,我得到了这种方法的想法。 Tks @ThoQuach:是的,每个新通道都会创建一个引用前一个通道的闭包,所以当你达到第 100 个素数时,你有 100 个并行运行的 goroutine,每个接收前一个发送的数据一。 这个程序用于说明解决查找素数问题的不同方法,但我看到它非常复杂并且以低效的方式使用计算资源以上是关于通道如何使用通道查找素数问题?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AudioKit 将一个立体声通道复制到另一个立体声通道