使用并发计算给定数字范围内所有素数的 Go 语言程序
在这篇 Go 语言文章中,我们将编写程序,使用并发执行来计算给定数字范围内所有素数。并发执行是同时执行多个任务的过程。在 Golang 中,使用 goroutine 和 channel 来创建并发程序。
Goroutine 是由 Go 运行时管理的轻量级线程,channel 则有助于在 goroutine 之间进行通信,避免冲突。
语法
func make ([] type, size, capacity)
Go 语言中的 **make** 函数用于创建数组/映射,它接受要创建的变量类型、大小和容量作为参数。
func range(variable)
range 函数用于迭代任何数据类型。要使用它,我们首先需要编写 range 关键字,然后是我们要迭代的数据类型,循环将迭代到变量的最后一个元素。
算法
此程序在程序中导入 main、fmt 和 sync 包
创建 main 函数
在 main 中,使用变量 limit 设置范围,以此计算素数。
然后,使用 make 函数创建一个名为 primes 的 channel,它将获取素数。
在此步骤中,创建一个 Wait Group wg,以便所有 goroutine 在退出 main 函数之前完成。
然后,通过调用 generatePrimes 函数启动 goroutine。
这里,将 limit、primes channel 和 wg 作为参数传递。
启动另一个 goroutine 来打印素数,方法是调用 printPrimes 函数。
这里,将 primes channel 和 Wait Group 作为参数传递。
然后,使用 wait 函数等待所有 goroutine 完成。
在此步骤中,创建一个名为 generatePrimes 的函数,用于生成给定 limit 范围内的素数。
在此函数中,将初始素数 2 和 3 发送到 primes channel。然后,它以 2 为步长从 5 迭代到 limit。
在每次迭代中,它通过从 3 迭代到数字的平方根来检查素数。
如果数字可以被这些除数中的任何一个整除,则它不是素数,isPrime 将设置为 false。否则,它将保持为 true。
如果数字是素数,则将其发送到 primes channel。
创建 printPrimes 函数,用于从 primes channel 接收素数并打印它们。
打印完所有数字后,它调用 wg.Done() 向 Wait Group 发出信号,表示它已完成打印。
所有 goroutine 完成后,程序结束。
示例
在此示例中,我们将编写一个 Go 语言程序,使用 goroutine 和 channel 来计算所有素数,以便进行并发执行。
package main import ( "fmt" "sync" ) func main() { limit := 100 primes := make(chan int) var wg sync.WaitGroup wg.Add(1) go generatePrimes(limit, primes, &wg) wg.Add(1) go printPrimes(primes, &wg) wg.Wait() } func generatePrimes(limit int, primes chan<- int, wg *sync.WaitGroup) { defer close(primes) defer wg.Done() primes <- 2 primes <- 3 for num := 5; num <= limit; num += 2 { isPrime := true for i := 3; i*i <= num; i += 2 { if num%i == 0 { isPrime = false break } } if isPrime { primes <- num } } } func printPrimes(primes <-chan int, wg *sync.WaitGroup) { defer wg.Done() fmt.Println("The prime numbers till the rage of 100 are:") for prime := range primes { fmt.Println(prime) } }
输出
The prime numbers till the rage of 100 are: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
结论
我们使用示例编译并执行了计算给定数字范围内素数的程序,其中我们使用 goroutine 和 channel 进行并发实现。