使用併發計算給定數字範圍內所有素數的 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 進行併發實現。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言
C++
C#
MongoDB
MySQL
Javascript
PHP