0
0

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

Go言語の並行処理: ゴルーチンとチャネルについて

Posted at

この記事では、Go言語の並行処理について記載します。
Go言語は、複数のタスクを同時に実行するための強力な機能を持っています。
その実現には、ゴルーチン(Goroutines)とチャネル(Channels)という2つの主要な概念がキーとなります。

ゴルーチンについて

ゴルーチンは、軽量なスレッドのようなもので、Goランタイムによって管理されます。ゴルーチンは非常に少ないメモリ(数KB)を使用し、必要に応じて成長・縮小します。これにより、数千から数百万のゴルーチンを同時に実行することが可能となります。

新しいゴルーチンは、goキーワードと関数呼び出しを組み合わせることで作成されます。

go doSomething()

上記のコードは、新しいゴルーチンを作成し、その中でdoSomething関数を非同期に実行します。

チャネルについて

チャネルは、ゴルーチン間での通信と同期を可能にするデータ構造です。一つのゴルーチンはチャネルにデータを送信し、別のゴルーチンはそのチャネルからデータを受信することができます。

チャネルは、make関数とチャネル型を使用して作成されます。

ch := make(chan int)

上記のコードは、整数を送受信するための新しいチャネルを作成します。

チャネルにデータを送信するには、送信演算子<-を使用します。

ch <- 10

上記のコードは、チャネルchに整数10を送信します。

チャネルからデータを受信するには、同じ送信演算子を使用しますが、この場合は左辺に変数を置きます。

x := <-ch

上記のコードは、チャネルchからデータを受信し、それを変数xに代入します。

ゴルーチンとチャネルの組み合わせ

ゴルーチンとチャネルは、一緒に使うことで最も強力になります。ゴルーチンは計算の並列化を可能にし、チャネルはその並列計算の結果を合成するための安全な方法を提供します。

以下に、ゴルーチンとチャネルを使用して、2つの関数を並列に実行し、その結果を合成する例を示します。

func main() {
    ch := make(chan int)

    go func() {
        ch <- doSomething()
    }()

    go func() {
        ch <- doSomethingElse()
    }()

    result1 := <-ch
    result2 := <-ch

    fmt.Println("Combined result:", result1 + result2)
}

上記のコードは、2つのゴルーチンを作成し、それぞれで異なる関数を実行します。各関数の結果はチャネルに送信され、メインゴルーチンではそれらの結果を受信し、合成します。

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