Web サイト上の現在のオンライン ユーザー数を表示します;
ユーザーが製品を選択すると、ショッピング カートの詳細が更新されます。 ;
「目標トランザクション量」までのカウントダウン;
Web サイトは、ユーザーの Web サイトへの関連性を維持し、Web サイトをユーザーにとって魅力的なものにして、より多くのビジネスを引き付けるために、これらすべてのタスクを同時に実行する必要があります。 したがって、ビジネス ニーズを満たすために、単純なアプリケーションまたは Web サイトにバックグラウンドで実行される一連のタスクが含まれる場合があります。
複数のタスクを完了する必要があるシングルコア マシンがあるが、制限があるというシナリオを想定します。コア マシン 実行できるタスクは 1 つだけです。
同時実行モデルでは、タスク間でコンテキストの切り替えが行われます。プログラムは複数のタスクを処理していますが、コアが 1 つしかないため、タスクを一緒に実行することはできません。
タスク間のコンテキストの切り替えが非常に速いため、タスクが同時に実行されているように感じられます。
シングルコアシステムのため複数のプロセスを並列実行できないため、実行処理中に並列実行の要素がありません。
上の図に示すように、同時実行 (並列処理なし) には、同時に実行する必要がある 2 つのタスクがあります。常に 1 つのタスクのみが実行され、タスク間でコンテキストが切り替わります。
単一コアを使用する場合、コアの数には制限があります。マシン内のコアの数を増やすと、異なるコアでタスクを同時に実行できます。
上の図 (並列処理) では、常に 2 つのタスクが実行されており、これら 2 つのタスクは異なるコアで実行されます。
同時性とは、一定期間内に複数のタスクを同時に処理することであり、並列性とは、特定の時点で複数のタスクを実行する機能です。
Go 言語を使用すると、プログラムを同時実行から並列実行に簡単に拡張できます。
Go 言語を使用して同時実行性と並列処理を実現するには、Goroutines の概念を理解する必要があります。 Go 言語のコルーチンは、オペレーティング システムではなく Go ランタイムによって管理される、スレッド上のラッパーとして理解できます。
Go ランタイムは、コルーチンへのリソースの割り当てとリサイクルを担当します。コルーチンは、マルチタスクを完了するスレッドに非常によく似ていますが、オペレーティング システムのスレッドよりも消費するリソースが少なくなります。コルーチンとスレッドの間には 1 対 1 の関係はありません。
アプリケーションを複数の同時タスクに「分解」し、異なるゴルーチンで完了できるようにすることで、Go 言語の同時実行性を実現できます。
コルーチンの利点:
より軽量;
簡単な拡張;
#仮想スレッド;
必要な初期メモリが少なくなります (2KB);
必要に応じて、Go ランタイムはより多くのメモリを割り当てることができます;
package main import ( "fmt" "time" ) func main() { start := time.Now() func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() elapsedTime := time.Since(start) fmt.Println("Total Time For Execution: " + elapsedTime.String()) time.Sleep(time.Second) }上記のコードは、main 関数内の 2 つの独立した関数を順番に実行します。 コードではコルーチンは使用されておらず、プログラムは同じスレッドで実行されます。プログラムには同時実行性がなく、実行結果は次のとおりです。 #コードは main 関数から順に実行され、最初の関数が最初に実行されます。 、次に 2 番目の関数を実行し、最後に main 関数を正常に終了します。
package main import ( "fmt" "time" ) func main() { start := time.Now() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() elapsedTime := time.Since(start) fmt.Println("Total Time For Execution: " + elapsedTime.String()) time.Sleep(time.Second) }上記のコード出力を実行します: 上記のコードは go キーワードを使用して 2 つのコルーチンを開いてそれぞれの関数 (メイン コルーチンを含む) を実行します。合計 3 つのコルーチンがあります。
runtime.GOMAXPROCS(4)これは、プログラムがマルチコア マシンで実行されることを指定できます。上記のコード行は、プログラムが 4 つのコアを使用して実行できることを指定します。 コルーチンを作成すると、異なるコアで実行できるため、並列処理が実現され、プログラムの実行が高速化されます。
package main import ( "fmt" "time" "runtime" ) func main() { runtime.GOMAXPROCS(4) start := time.Now() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() elapsedTime := time.Since(start) fmt.Println("Total Time For Execution: " + elapsedTime.String()) time.Sleep(time.Second) }上記のコード出力は次のとおりです:
並行性と並列性は、Go 言語を使用して簡単に実現できます。関数の前に go キーワードを追加するだけで、プログラムの実行速度が向上します。
以上がGo の基本ゴルーチンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。