Golang の同時実行性: Goroutine の使用方法? 詳細なガイド

Go 言語にはゴルーチンと呼ばれる特別な関数が用意されています。ゴルーチンは、プログラム内に存在する他のゴルーチンとは独立して同時に実行される関数またはメソッドです。つまり、各 Go 言語で同時に実行されるアクティビティをゴルーチンと呼びます。ゴルーチンは軽量のスレッドと考えることができます。ゴルーチンの作成にかかるコストは、スレッドに比べて非常に小さいです。各プログラムには少なくとも 1 つのゴルーチンが含まれており、このゴルーチンはメイン ゴルーチンと呼ばれます。メインのゴルーチンが終了すると、すべてのゴルーチンがメインのゴルーチンの下で実行され、プログラム内に存在するすべてのゴルーチンも終了します。goroutine は常にバックグラウンドで実行されます。

 

ゴルーチンを作成するにはどうすればよいですか?

次の構文に示すように、関数またはメソッド呼び出しの前に go キーワードを付けるだけで、独自のゴルーチンを作成できます。

構文は次のとおりです。

func name(){
// statements
}

// using go keyword as the 
// prefix of your function call
go name()

例:

// Go program to illustrate
// the concept of Goroutine
package main
  
import "fmt"
  
func display(str string) {
     for w := 0; w < 6; w++ {
         fmt.Println(str)
     }
}
  
func main() {
  
     // Calling Goroutine
     go display( "Welcome" )
  
     // Calling normal function
     display( "lsbin" )
}

出力は次のとおりです。

lsbin
lsbin
lsbin
lsbin
lsbin
lsbin

上の例では、単純に display() 関数を作成し、この関数を 2 つの異なる方法で呼び出します。1 つは show("Welcome") を実行するゴルーチンで、もう 1 つは show( "lsbin" を実行する通常の関数です) )。しかし問題があります。新しい Goroutine が実行されると、Goroutine 呼び出しはすぐに返されるため、Goroutine の結果ではなく、通常の関数の結果のみが表示されます。通常の関数のようにゴルーチンの実行が完了するのを待つのではなく、常にゴルーチンの呼び出し後に次の行に進み、ゴルーチンから返された値を無視します。したがって、ゴルーチンを正しく実行するには、次のコードに示すように、プログラムにいくつかの変更を加えます。

変更された例:

// Go program to illustrate the concept of Goroutine
package main
  
import (
     "fmt"
     "time"
)
  
func display(str string) {
     for w := 0; w < 6; w++ {
         time .Sleep(1 * time .Second)
         fmt.Println(str)
     }
}
  
func main() {
  
     // Calling Goroutine
     go display( "Welcome" )
  
     // Calling normal function
     display( "lsbin" )
}

出力は次のとおりです。

Welcome
lsbin
lsbin
Welcome
Welcome
lsbin
lsbin
Welcome
Welcome
lsbin
lsbin

プログラムに Sleep() メソッドを追加しました。これにより、新しいゴルーチンの実行の間にメインのゴルーチンが 1 秒間スリープし、「ようこそ」が表示され、1 秒後にメインのゴルーチンが再スケジュールされ、操作の実行後に終了します。このプロセスは、z < 6 になってメインのゴルーチンが終了するまで続きます。ここでは、ゴルーチンと通常の関数が同時に動作します。

ゴルーチンの利点

  • ゴルーチンはスレッドよりも安価です。
  • ゴルーチンはスタックに格納され、スタックのサイズはプログラムの要件に応じて拡大または縮小できます。ただし、スレッドではスタックのサイズは固定されています。
  • Goroutine はチャネルを使用して通信できます。これらのチャネルは、Goroutine を使用して共有メモリにアクセスするときに競合状態を防ぐように特別に設計されています。
  • プログラムに 1 つのスレッドがあり、そのスレッドに多数の Goroutine が関連付けられているとします。リソース要件によりいずれかの Goroutine がスレッドをブロックした場合、残りのすべての Goroutine は新しく作成された OS スレッドに割り当てられます。これらすべての詳細はプログラマには隠されています。

 

匿名ゴルーチン

Go 言語では、匿名関数のゴルーチンを開始することもできます。つまり、次の構文に示すように、関数の先頭に go キーワードを付けるだけで匿名ゴルーチンを作成できます。

構文は次のとおりです。

// Anonymous function call
go func (parameter_list){
// statement
}(arguments)

例:

// Go program to illustrate how
// to create an anonymous Goroutine
package main
  
import (
     "fmt"
     "time"
)
  
// Main function
func main() {
  
     fmt.Println( "Welcome!! to Main function" )
  
     // Creating Anonymous Goroutine
     go func() {
  
         fmt.Println( "Welcome!! to lsbin" )
     }()
  
     time .Sleep(1 * time .Second)
     fmt.Println( "GoodBye!! to Main function" )
}

出力は次のとおりです。

Welcome!! to Main function
Welcome!! to lsbin
GoodBye!! to Main function

Golang 開発の詳細については、以下を参照してください。lsbin - IT 開発テクノロジー: https://www.lsbin.com/

以下のその他の JS 関連コンテンツをチェックしてください。

おすすめ

転載: blog.csdn.net/u014240783/article/details/115387219