並列処理
並列処理は、複数のタスクを同時に実行することを指します。この実行は主にマルチコアプロセッサなどの複数のハードウェアスレッドを活用して行われます。つまり、複数のコアがそれぞれ別々のタスクを処理することで、処理を高速化します。
特徴
- 複数のタスクが同じタイミングで処理される
- 並列処理には複数のCPUコアまたはスレッドが必要
- パフォーマンスの向上(処理速度の向上)
イメージ図
Task 1: [----処理----]
Task 2: [----処理----]
Goサンプルコード
package main
import (
"fmt"
"math"
"runtime"
"sync"
)
// 配列内の要素を平方根に変換する
func parallelProcessing(arr []float64) []float64 {
numCores := runtime.NumCPU() // 使用可能なCPUコア数
runtime.GOMAXPROCS(numCores)
chunkSize := len(arr) / numCores
var wg sync.WaitGroup
result := make([]float64, len(arr))
// 並列で処理
for i := 0; i < numCores; i++ {
start := i * chunkSize
end := start + chunkSize
if i == numCores-1 {
end = len(arr)
}
wg.Add(1)
go func(start, end int) {
defer wg.Done()
for j := start; j < end; j++ {
result[j] = math.Sqrt(arr[j])
}
}(start, end)
}
wg.Wait()
return result
}
func main() {
data := make([]float64, 1_000_000)
for i := range data {
data[i] = float64(i + 1)
}
result := parallelProcessing(data)
fmt.Println("First 10 results:", result[:10])
}
Number of CPU cores: 4
First 10 results: [1 1.4142135623730951 1.7320508075688772 2 2.23606797749979 2.449489742783178 2.6457513110645907 2.8284271247461903 3 3.1622776601683795]
並行処理
並行処理は、複数のタスクを同時に進めているように見せることを指します。タスク間で処理を切り替えながら進行するため、実際には1つのCPUコアで複数のタスクを処理する場合もあります。
特徴
- タスク間の切り替えを繰り返して実行される
- 単一のコアでも実現可能
- スループットの向上(複数のタスクを効率よく管理)
イメージ図
Task 1: [--処理--] [--処理--]
Task 2: [--処理--] [--処理--]
Goサンプルコード
package main
import (
"fmt"
"time"
)
// 時間のかかる処理
func task(name string) {
for i := 1; i <= 3; i++ {
fmt.Printf("%s: step %d\n", name, i)
time.Sleep(1 * time.Second)
}
}
func main() {
// 並行処理
go task("Task A")
go task("Task B")
go task("Task C")
// プログラムが終了しないように待機
time.Sleep(5 * time.Second)
fmt.Println("All tasks completed")
}
Task C: step 1
Task A: step 1
Task B: step 1
Task B: step 2
Task A: step 2
Task C: step 2
Task C: step 3
Task A: step 3
Task B: step 3
All tasks completed