LoginSignup
0
0

More than 1 year has passed since last update.

Go言語における並列処理について

Last updated at Posted at 2023-03-29

はじめに

Go言語は、並列処理を容易に実装するための強力な機能であるゴルーチン(goroutines)とチャネル(channels)を提供しています。ゴルーチンは軽量なスレッドのようなもので、低いオーバーヘッドで大量の並列処理を実行できます。チャネルは、ゴルーチン間でデータの受け渡しを行うための同期メカニズムです。

ゴルーチンの軽量性

Go言語のゴルーチンは、軽量なスレッドのようなもので、低いオーバーヘッドで大量の並列処理を実行できます。他の言語のスレッドよりもリソース消費が少なく、数千や数万のゴルーチンを同時に実行することが可能です。

簡潔な並列処理の構文:

Go言語は、goキーワードを使って簡単に並列処理を実装できます。これにより、関数やメソッドをゴルーチンとして実行でき、コードの可読性が向上します。他の言語では、スレッドの作成や管理に多くのコードが必要であることが多いですが、Go言語では簡潔に記述できます。

チャネルによる同期とデータの受け渡し:

Go言語では、チャネルを使用してゴルーチン間でデータの受け渡しを行い、同期をとることができます。これにより、複雑なロックや同期プリミティブを使わずに、直感的かつ安全な並列処理を実現できます。他の言語では、ロックや条件変数などを使って同期を行う必要がある場合が多く、コードが複雑になりがちです。

ガーベッジコレクション:

Go言語は、ガーベッジコレクションをサポートしており、メモリ管理が容易です。他の言語では、メモリ管理が手動で行われることが多く、並列処理の実装時にリソースリークやデータ競合が発生しやすいですが、Go言語では自動的にメモリ管理が行われるため、そのような問題が少なくなります。

優れた標準ライブラリ:

Go言語は、並列処理やネットワーキングをサポートする優れた標準ライブラリを提供しています。これにより、開発者は追加のライブラリを探すことなく、効率的な並列処理を実装できます。

サンプル説明

Go言語での並列処理のサンプルコードを記載。

package main

import (
	"fmt"
	"time"
)

// 時間のかかる処理を模した関数
func worker(id int, jobs <-chan int, results chan<- int) {
	for j := range jobs {
		fmt.Printf("Worker %d started job %d\n", id, j)
		time.Sleep(time.Second) // 1秒間スリープ
		fmt.Printf("Worker %d finished job %d\n", id, j)
		results <- j * 2
	}
}

func main() {
	// ジョブ用のチャネルと結果用のチャネルを作成
	jobs := make(chan int, 100)
	results := make(chan int, 100)

	// 3つのワーカーゴルーチンを起動
	for w := 1; w <= 3; w++ {
		go worker(w, jobs, results)
	}

	// ジョブを9つ追加
	for j := 1; j <= 9; j++ {
		jobs <- j
	}
	close(jobs)

	// 結果を9つ表示
	for a := 1; a <= 9; a++ {
		fmt.Printf("Result: %d\n", <-results)
	}
}

↓上記のコードを動かす(コードをコピーして貼り付けで動作確認出来ます。)↓

このコードでは、worker関数が、ゴルーチンで実行される処理を定義しています。この関数は、jobsチャネルからジョブを受け取り、処理を行った後に、resultsチャネルに結果を送信します。

main関数内では、まずjobsresultsという2つのチャネルを作成しています。次に、3つのワーカーゴルーチンを起動して、それぞれのワーカーにjobsとresultsチャネルを渡しています。その後、jobsチャネルに9つのジョブを追加し、最後にresultsチャネルから結果を受け取り、表示しています。

このサンプルコードは、並列処理を実現しており、3つのワーカーゴルーチンが同時にジョブを処理し、結果を返す様子が確認できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0