ゴルーチン(goroutine)
goの基本構文を学んでいくうえで今一つイメージが掴みづらかったゴルーチンについてまとめてみた。
● ゴルーチン(goroutine)は、Go言語で並行処理を実現するための軽量スレッドである。
● ゴルーチンは、通常のスレッドよりも低コストで作成され、数千〜数百万のゴルーチンを簡単に起動できる。
● ゴルーチンは、キーワード「go」を使って関数呼び出しの前に指定することで作成される。
以下がコード例である
func main() {
go hello()
}
func hello() {
fmt.Println("Hello, goroutine!")
}
このコードでは、hello 関数が新しいゴルーチンとして実行される。main 関数が終了しても、ゴルーチンは実行を続ける。
ゴルーチンは、Goのランタイムによってスケジュールされ、複数のゴルーチンが同時に実行されることがある。Goのランタイムは、マルチコアプロセッサの利用やブロッキングIOの効率的な管理など、ゴルーチンを効果的に処理する。ゴルーチンは通常、共有メモリへのアクセスを同期するためにチャネル(channel)などの同期プリミティブと組み合わせて使用される。これにより、データ競合や同期の問題を回避しながら、効率的な並行処理が可能になる。
上記がぱっと調べてみてヒットした内容だが、理解がイマイチな言葉もあったりするので一通りまとめてみる。
スレッドにとは
そもそもスレッドとは何か理解があいまいなので概要を以下に書き記しておく
● スレッドは、プログラム内での実行の基本単位であり、プロセス内での実行の流れを表す。
● 通常、プロセス内で複数のスレッドが同時に実行され、それぞれが独自の処理を行う。
● スレッドはプロセス内の資源を共有し、同じプロセス内の他のスレッドと同じメモリ空間を共有する。
スレッドの特徴には以下があげられる。
-
軽量性: スレッドはプロセスよりも軽量であり、スレッドの切り替えにかかるコストが少ないため、効率的に多数のスレッドを作成できる
-
並行性: 複数のスレッドが同時に実行されることがあります。これにより、複数の処理を同時に行うことが可能になる
-
共有メモリ: 同じプロセス内のスレッドは同じメモリ空間を共有します。このため、スレッド間でデータの共有や通信が容易に行える
-
プログラムの並列化: 複数のスレッドを使用することで、プログラムを効率的に並列化し、複数の処理を同時に実行することができる
ただし、スレッドを使用する際には、データ競合や同期の問題に注意する必要がある。複数のスレッドが同時に同じデータにアクセスしようとすると、予期しない結果が発生する可能性があるため、適切な同期手法を使用してこれらの問題を回避する必要がある。
さらによく分からない言葉でてきたのでいかに記してゆく、、、(CS教養無男)
実行の基本単位とは
実行の基本単位は、プログラムが実行される際に分割される最小の単位を指し、これにはいくつかの概念があるが、その中で最も一般的なものは命令、プロセス、スレッドの3つ。
命令 (Instruction):
命令は、プログラムが実行される際にプロセッサが解釈し、実行する個々の操作を表す。命令は機械語の形式で表され、プロセッサによって直接実行される。
プロセス (Process):
プロセスは、実行中のプログラムのインスタンスである。プロセスには、実行中のプログラムのコード、データ、および実行状態に関する情報が含まれる。プロセスは、オペレーティングシステムによって管理され、独自のメモリ空間を持つ。
スレッド (Thread):
スレッドは、プロセス内で実行される実行の流れの単位。スレッドは軽量であり、複数のスレッドが同時に実行されることができる。スレッドはプロセス内のリソースを共有し、同じプロセス内の他のスレッドと同じメモリ空間を共有します。
まとめ
・・・とのことだった。つまりスレッドを上手く利用することで処理速度が速くなるのだろうということは何となく分かった。なるほど、非同期処理はこれを利用していたのか(今更)
ということでjavaでは「Thread」クラスを使って非同期処理(つまりスレッドによる並行処理)を実現していたが、goではゴルーチンで実現しているということのようだ。
関数呼び出しの前に「go」を指定するというのは「今から呼び出す関数は別スレッドを使いますよ」と宣言するようなものなのかもしれない、、、
他にもいくつか理解があいまいな言葉があったため以下に記しておく
● 共有メモリ・・・複数のプロセスやスレッドが同じメモリ領域を参照すること。プロセスやスレッド間でデータを共有するために使用される。
● 同期プリミティブ・・・マルチスレッドやマルチプロセスの環境で、複数のスレッドやプロセスが共有リソースにアクセスする際に、そのアクセスを制御し同期させるための基本的な仕組みやツールのこと。次回確認予定のチャネルもこれに該当する