ホームページ  >  記事  >  バックエンド開発  >  Go の基本ゴルーチン

Go の基本ゴルーチン

Golang菜鸟
Golang菜鸟転載
2023-08-08 16:30:10734ブラウズ



#この記事では、引き続き Go 言語の基本に焦点を当てていきます。パフォーマンスについて少し説明し、いくつかの単純なゴルーチンを作成してアプリケーションを拡張します。

Go 言語の基礎となる実行ロジックの一部と、Go 言語と他の言語の違いにも注目します。

Go 言語の同時実行性

議論を続ける前に、同時実行性と並列性の概念を理解する必要があります。 Golang は同時実行と並列処理を実現できます。

同時実行と並列処理の違いを見てみましょう。

同時実行性について

Go の基本ゴルーチン

アプリケーションは、意図した機能を達成するために複数のプロセスを処理することがあります。単純な EC サイトを想定すると、次のタスクを並行して実行する必要があると評価されています。 Web ページ;

  1. Web サイト上の現在のオンライン ユーザー数を表示します;

  2. ユーザーが製品を選択すると、ショッピング カートの詳細が更新されます。 ;

  3. 「目標トランザクション量」までのカウントダウン;

  4. Web サイトは、ユーザーの Web サイトへの関連性を維持し、Web サイトをユーザーにとって魅力的なものにして、より多くのビジネスを引き付けるために、これらすべてのタスクを同時に実行する必要があります。 したがって、ビジネス ニーズを満たすために、単純なアプリケーションまたは Web サイトにバックグラウンドで実行される一連のタスクが含まれる場合があります。

  5. 上に示した 2 つの例では、複数のタスクが同時に実行されますが、それでもそれらの間には違いがあります。より深く理解するためにさらに勉強しましょう。

同時実行性と並列実行について理解する

同時アプリケーションの処理

複数のタスクを完了する必要があるシングルコア マシンがあるが、制限があるというシナリオを想定します。コア マシン 実行できるタスクは 1 つだけです。

同時実行モデルでは、タスク間でコンテキストの切り替えが行われます。プログラムは複数のタスクを処理していますが、コアが 1 つしかないため、タスクを一緒に実行することはできません。

タスク間のコンテキストの切り替えが非常に速いため、タスクが同時に実行されているように感じられます。

シングルコアシステムのため複数のプロセスを並列実行できないため、実行処理中に並列実行の要素がありません。

上の図に示すように、同時実行 (並列処理なし) には、同時に実行する必要がある 2 つのタスクがあります。常に 1 つのタスクのみが実行され、タスク間でコンテキストが切り替わります。

アプリケーションは並列処理に参加します

単一コアを使用する場合、コアの数には制限があります。マシン内のコアの数を増やすと、異なるコアでタスクを同時に実行できます。

上の図 (並列処理) では、常に 2 つのタスクが実行されており、これら 2 つのタスクは異なるコアで実行されます。

同時性とは、一定期間内に複数のタスクを同時に処理することであり、並列性とは、特定の時点で複数のタスクを実行する機能です。

Go 言語を使用すると、プログラムを同時実行から並列実行に簡単に拡張できます。

Goroutines の使用

Go 言語を使用して同時実行性と並列処理を実現するには、Goroutines の概念を理解する必要があります。 Go 言語のコルーチンは、オペレーティング システムではなく Go ランタイムによって管理される、スレッド上のラッパーとして理解できます。

Go ランタイムは、コルーチンへのリソースの割り当てとリサイクルを担当します。コルーチンは、マルチタスクを完了するスレッドに非常によく似ていますが、オペレーティング システムのスレッドよりも消費するリソースが少なくなります。コルーチンとスレッドの間には 1 対 1 の関係はありません。

Go の基本ゴルーチン

アプリケーションを複数の同時タスクに「分解」し、異なるゴルーチンで完了できるようにすることで、Go 言語の同時実行性を実現できます。

コルーチンの利点:

  1. より軽量;

  2. 簡単な拡張;

  3. #仮想スレッド;

  4. 必要な初期メモリが少なくなります (2KB);

  5. 必要に応じて、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 つの独立した関数を順番に実行します。

コードではコルーチンは使用されておらず、プログラムは同じスレッドで実行されます。プログラムには同時実行性がなく、実行結果は次のとおりです。

Go の基本ゴルーチン

#コードは main 関数から順に実行され、最初の関数が最初に実行されます。 、次に 2 番目の関数を実行し、最後に main 関数を正常に終了します。

コルーチンの紹介

上記のシナリオ例ではコルーチンは使用されていません。 go キーワードを使用して、関数を実行する前にコルーチンを開始できます。

引き続き上記の例ですが、go キーワードを使用してコルーチンを開いた後にどのようになるかを見てみましょう:

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 の基本ゴルーチン

上記のコードは go キーワードを使用して 2 つのコルーチンを開いてそれぞれの関数 (メイン コルーチンを含む) を実行します。合計 3 つのコルーチンがあります。

逐次実行の違いを理解する

上記のコードでは、 go キーワードを使用してコルーチンを開き、関数はコルーチン内で実行されます。 in the main コルーチンで実行されるため、同時実行性が向上し、プログラムのパフォーマンスが向上します。

並列性の向上

Go の基本ゴルーチン

Go 言語では、次の簡単な行でプログラムを実行するコアの数を設定できます。コードの数 (追記: Go 1.5 以降、Go の GOMAXPROCS のデフォルト値は CPU のコア数に設定されています)。

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 キーワードを追加するだけで、プログラムの実行速度が向上します。

以上がGo の基本ゴルーチンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はGolang菜鸟で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。