コンピューター技術の継続的な発展により、マルチコア CPU が標準になりました。同時プログラミングは今日のソフトウェア開発において非常に重要であり、Go 言語はその独自の同時実行メカニズムにより、最も人気のある同時プログラミング言語の 1 つとなっています。この記事では、Go 言語での同時プログラミングの概念とテクニックについて説明します。
同時実行とは、同じ時間間隔内に 2 つ以上のイベントが発生することを意味します。コンピューティングにおいて、これは、同じ時間間隔内で複数のタスクを同時に実行できることを意味します。並行プログラミングとは、複数のタスクを同時に実行できるプログラムを作成するプログラミング技術を指します。
同時プログラミングと並列プログラミングの概念は異なります。並行プログラミングは複数のタスクを同時に実行することを指しますが、並列プログラミングは複数のプロセッサまたは処理コアで複数のタスクを同時に実行することを指します。コンピューターの分野では、同時実行性と並列性はしばしば同じ意味で使用されますが、本質的には異なります。
Go 言語は、構文とランタイムの両方で同時プログラミングをサポートします。 Go 言語の Goroutine は非常に軽量なスレッドです。Goroutine は実行するために少量のスタック領域を占有するだけで済みます。同時に、Go プログラムは数千の Goroutine を持つことができるため、Go プログラムは並行タスクを効率的に実行できます。
Go 言語の同時実行性は、共有メモリを介した通信ではなく、通信を通じてメモリを共有する CSP 同時実行モデルを採用しています。 Go 言語では、チャネルを使用してゴルーチン間の通信を実装できます。
次の方法でチャネルを定義できます:
ch := make(chan int)
Go 言語の組み込み go
キーワードを使用して、Goroutine を開始します:
go printHelloWorld()
この段落内 コードでは、printHelloWorld()
は関数であり、go
キーワードによって開始されたゴルーチンは、新しいスレッドで独立して実行されます。
3.1 チャネルを使用して Goroutine を調整する
前述したように、Go 言語ではチャネルを使用して Goroutine 通信を実装できます。間。チャネルは、2 つ以上のゴルーチン間の調整や共有リソースの制御に使用できます。
package main import "fmt" func hello(done chan bool) { fmt.Println("Hello world Goroutine") done <- true } func main() { done := make(chan bool) go hello(done) <-done fmt.Println("main function") }
このコードでは、hello()
関数の外側で done
チャネルを定義し、それを hello()
関数に渡します。 hello()
関数では、メッセージを出力し、hello()
を表す true
値を done
チャネルに書き込みます。関数の実行が完了しました。 main()
関数では、<-done
構文を通じてチャネルからデータを読み取り、hello()
関数が完了するまで待機し、 true
値が done
チャネルに書き込まれます。このようにして、Goroutine の調整を実現します。
3.2 select ステートメントの使用
select ステートメントを使用すると、複数のチャネル操作を同時に処理できます。 select ステートメントでは、複数のチャネルを定義し、一連の case ステートメントを通じてそれらを処理できます。
package main import ( "fmt" "time" ) func main() { ch1 := make(chan int) ch2 := make(chan string) go func() { ch1 <- 1 }() go func() { ch2 <- "hello" }() for i := 0; i < 2; i++ { select { case num := <-ch1: fmt.Println("ch1:", num) case str := <-ch2: fmt.Println("ch2:", str) case <-time.After(time.Millisecond * 100): fmt.Println("timeout") } } }
このコードでは、2 つのチャネル ch1
と ch2
を定義し、これら 2 つのチャネルにそれぞれ書き込む 2 つのゴルーチンを開始します。 main()
関数では、for ループを通じてこれら 2 つのチャネルの入力を処理し、select ステートメントを使用して使用可能なチャネルの 1 つを選択し、その入力を処理します。一定時間内にチャネルが利用できない場合は、time.After()
関数を使用してタイムアウト処理を実装できます。
この記事では、Go 言語での同時プログラミングの概念とテクニックについて説明しました。 Goroutine とチャネルを通じて、同時プログラミングを効率的に実装できます。並行プログラムを作成するときは、チャネルを使用して Goroutine を調整したり、select ステートメントを使用して複数の Goroutine の実行を同期したりするなど、いくつかの基本的なテクニックに従う必要があります。これらのテクニックは、効率的で安定した同時実行プログラムを作成するのに役立ちます。
以上がGo 言語による同時プログラミングの概念とテクニックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。