使用併發計算給定數字範圍內所有素數的 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 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.