Go 言語における並行性と並列性の違いについての調査
Go 言語では、並行性と並列性の概念をよく耳にします。これら 2 つの単語は同じ意味でよく使われますが、実際には異なる意味を持っています。この記事では、Go 言語における同時実行と並列処理の違いについて説明し、具体的なコード例を使用してそれらの違いを説明します。
まず、同時実行性と並列処理の定義を見てみましょう:
Go 言語では、同時実行性は goroutine によって実現されます。 Goroutine は Go 言語の軽量スレッドで、Go 言語のランタイム システムによってスケジュールされ、単一スレッドでの同時実行を実現します。 goroutine はキーワード go
を使用して作成できるため、独立した goroutine で関数を実行できます。
簡単な例で同時実行と並列処理の違いを説明します。
package main import ( "fmt" "runtime" "time" ) func task(id int) { for i := 0; i < 5; i++ { fmt.Printf("Task %d: %d ", id, i) time.Sleep(time.Millisecond * 100) } } func main() { runtime.GOMAXPROCS(2) // 设置使用的最大CPU核心数 go task(1) go task(2) time.Sleep(time.Second) }
上のコードでは、2 つの関数 task
を定義します。それぞれの関数はタスクを出力します。情報を 5 回印刷し、各印刷後に 100 ミリ秒間停止します。 main
関数では、go
キーワードを使用して 2 つのゴルーチンを開始し、これら 2 つのタスク関数を実行します。最後に、time.Sleep
関数を使用して 1 秒間待機し、2 つのゴルーチンが実行を完了するのに十分な時間を確保します。
上記のコードを実行すると、2 つのゴルーチンのタスクが同時にではなく交互に実行されることがわかります。これは同時実行性の概念です。タスクは同じスレッド上で交互に実行されますが、ほぼ同時に発生するため、時間的には並列に感じられます。
並列処理を実現するために、コードにいくつかの調整を加えることができます:
package main import ( "fmt" "runtime" ) func task(id int) { for i := 0; i < 5; i++ { fmt.Printf("Task %d: %d ", id, i) } } func main() { runtime.GOMAXPROCS(2) // 设置使用的最大CPU核心数 go task(1) go task(2) // 等待任务完成 fmt.Scanln() }
この変更されたコードでは、タスク関数の時間停止を削除し、fmt を渡します。 Scanln()
関数により、プログラムはユーザー入力を待機します。このようにして、2 つの goroutine タスクは時間停止によってブロックされないため、実際には同時に実行され、並列効果が得られます。
この例を通して、同時実行と並列処理の違いが明確にわかります。並行性は単一のスレッドで複数のタスクを交互に実行することで効率を向上させますが、並列性は実際に複数のタスクを複数のプロセッサで同時に実行します。 Go 言語では、同時実行性と並列性は goroutine および GOMAXPROCS
関数を通じて簡単に実現できます。
一般に、Go 言語での同時プログラミングのアプリケーションを理解するには、同時実行性と並列処理の概念を習得することが重要です。 2 つの違いを深く理解することによってのみ、Go 言語の機能をより適切に活用して効率的な同時実行プログラムを作成できるようになります。
この記事の考察を通じて、読者が Go 言語の同時実行性と並列性の概念をより明確に理解し、また具体的なコード例を通じてこれら 2 つの概念についての理解を深められることを願っています。実際の Go 言語プログラミングでは、並行性と並列テクノロジを柔軟に使用することで、プログラムのパフォーマンスと効率を向上させることができます。
以上がGo 言語における同時実行性と並列性の違いの探求の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。