使用併發計算整數切片之和的Go語言程式
在這篇 Go 語言文章中,我們將編寫程式來接收整數切片並使用併發計算它們的和。併發有助於同時執行多個任務或操作。它有助於有效利用系統資源。它是使用 Go 協程(輕量級執行緒)和通道(有助於 Go 協程之間通訊)實現的。
語法
func make ([] type, size, capacity)
Go 語言中的 make 函式用於建立陣列/對映,它接受要建立的變數型別、大小和容量作為引數。
func range(variable)
range 函式用於迭代任何資料型別。要使用它,我們首先必須編寫 range 關鍵字,然後是我們要迭代到的資料型別,結果迴圈將迭代到變數的最後一個元素。
func len(v Type) int
len() 函式用於獲取任何引數的長度。它將一個引數作為要查詢其長度的資料型別變數,並返回一個整數,即變數的長度。
演算法
此程式匯入 fmt、main 和 sync 作為必要的包,其中 fmt 用於輸入/輸出操作,main 用於生成可執行程式碼,sync 用於實現併發任務。
建立一個名為 sum 的函式,它接收一個整數切片,需要計算其和。
建立一個 total 變數並將其初始化為 0。
然後,使用 range 函式迭代整數切片,並在每次迭代中將輸入元素新增到 total 變數。
迭代所有元素後,返回 total 作為計算出的和。
在此步驟中,建立一個併發 Sum 函式,它接收一個整數切片並使用併發計算它們的和。
然後,根據切片的長度確定將輸入切片劃分的塊數,並將其儲存在 num-chunks 變數中。
然後,使用 make 函式建立一個 sums 切片來儲存每個 goroutine 計算的部分和。
在此步驟中,初始化一個 sync.WaitGroup 並使用 Add 方法向其中新增一個等於塊數的計數。
在這裡,計算塊大小以均勻劃分輸入切片。
然後,使用 for 迴圈為每個塊啟動一個 go 協程。
在每個 go 協程中,使用 sum 函式計算其對應塊的和,並將結果儲存在 sums 切片中。
在此步驟中,使用 wg.Wait() 函式等待所有 go 協程完成。
最後,將計算出的和作為結果返回給函式。
建立一個 main 函式。
在 main 中,建立一個名為 slice 的整數切片。
然後,呼叫 slice 上的 concurrent_sum 函式以使用併發計算和。
然後,使用 fmt 包中的 Println 函式(ln 表示換行)將計算出的和列印到控制檯。
示例
在此示例中,我們將編寫一個 Go 語言程式,藉助 go 協程和通道併發執行程式來計算切片中整數的和。
package main
import (
"fmt"
"sync"
)
func sum(nums []int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func concurrent_sum(nums []int) int {
num_chunks := len(nums)
sums := make([]int, num_chunks)
var wg sync.WaitGroup
wg.Add(num_chunks)
chunkSize := (len(nums) + num_chunks - 1) / num_chunks
for i := 0; i < num_chunks; i++ {
go func(i int) {
defer wg.Done()
start := i * chunkSize
end := (i + 1) * chunkSize
if end > len(nums) {
end = len(nums)
}
sums[i] = sum(nums[start:end])
}(i)
}
wg.Wait()
return sum(sums)
}
func main() {
slice := []int{10, 20, 30, 40, 50, 60, 70, 80, 90, 100}
fmt.Println("Numbers:", slice)
total := concurrent_sum(slice)
fmt.Println("The Sum of the elements of slice is:", total)
}
輸出
Numbers: [10 20 30 40 50 60 70 80 90 100] The Sum of the elements of slice is: 550
結論
我們編譯並執行了使用示例程式計算整數切片之和的程式,該示例程式使用 go 協程和通道來執行併發程序。因此,獲得了併發性。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP