使用并发计算给定数字范围内所有素数的 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 进行并发实现。

更新于: 2023年8月4日

355 次查看

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告