通道如何使用通道查找素数问题?

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 := &lt;-ch 每次总是从不同的通道中读取第一个值。 ch = PrimeFilter(ch, prime) @Groo 你是对的,这就是为什么即使我打印 i (迭代器)也无法对流程进行成像 【参考方案1】:

这是一个相当复杂的例子。在这两个函数中,go func()...() 创建了一个匿名 goroutine 并异步运行它,然后返回将从 goroutine 接收值的通道。 PrimeFilter 返回一个通道,该通道将接收不能被某个候选者整除的数字。

这个想法是prime := &lt;-ch 总是从通道中获取第一个元素。因此,可视化流程:

    GenerateNatural() 首先发送数字 2、3、4... 到 ch

    第一次循环迭代:

    一个。 prime := &lt;-ch 读取第一个(质数)数字2

    b. PrimeFilter(ch, 2) 然后继续接收其余数字(345、...),并将不能被 2 整除的数字发送到输出通道。因此,PrimeFilter(ch, 2) 返回的频道将收到数字(357、...)。

    c。主函数中的ch = PrimeFilter(ch, prime) 现在替换本地ch 变量为上一步中PrimeFilter(ch, 2) 的输出。

    第二次循环迭代:

    一个。 prime := &lt;-ch 从当前 ch 实例中读取第一个(质数)数字(第一个数字是 3)。

    b. PrimeFilter(ch, 3) 然后继续接收(已经过滤的)数字,除了第一个数字(所以,579,...),并将不能被 3 整除的数字发送到输出渠道。因此,PrimeFilter(ch, 2) 返回的频道将收到数字5711、...,因为9 可以被3 整除。

    c。主函数中的ch = PrimeFilter(ch, prime) 现在替换本地ch 变量为上一步中PrimeFilter(ch, 3) 的输出。

    ...

【讨论】:

所以,Go 主程序会在每次迭代后替换 ch 通道,并且不会关闭任何通道,对吧?在您说明了一些步骤之后,我得到了这种方法的想法。 Tks @ThoQuach:是的,每个新通道都会创建一个引用前一个通道的闭包,所以当你达到第 100 个素数时,你有 100 个并行运行的 goroutine,每个接收前一个发送的数据一。 这个程序用于说明解决查找素数问题的不同方法,但我看到它非常复杂并且以低效的方式使用计算资源

以上是关于通道如何使用通道查找素数问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 将 1 通道图像转换为 3 通道?

如何使用 C# 获取主板内存通道类型?

如何使用 AudioKit 将一个立体声通道复制到另一个立体声通道

我如何向 windows 询问 RAM 是在单通道、双通道还是四通道中运行?

如何连接多个音频输出通道以与 PyAudio 一起使用?

如何使用 JavaCV 库将 IplImage 拆分为 HSV 通道