Go では関数とゴルーチンの間に親子関係があり、親ゴルーチンは子ゴルーチンを作成し、子ゴルーチンは親ゴルーチンの変数にアクセスできますが、その逆はできません。 go キーワードを使用して子ゴルーチンを作成します。子ゴルーチンは、匿名関数または名前付き関数を通じて実行されます。親ゴルーチンは、すべての子ゴルーチンが完了する前にプログラムが終了しないように、sync.WaitGroup を介して子ゴルーチンが完了するのを待つことができます。
Go 言語において、 goroutine は同時に実行される関数です。ゴルーチンは親子関係で編成され、親ゴルーチンが子ゴルーチンを作成します。子ゴルーチンは親ゴルーチンの変数にアクセスできますが、親ゴルーチンは子ゴルーチンの変数にアクセスできません。
go
キーワードを使用して子ゴルーチンを作成します。
go func() { // 子 goroutine 代码 }
子ゴルーチンは匿名関数を実行します。同様に、名前付き関数を go
に渡すことができます。 キーワード:
func child() { // 子 goroutine 代码 } go child()
子ゴルーチンは、明示的な型転送を行わずに親ゴルーチンのローカル変数にアクセスできます。これは、ゴルーチンが同じメモリ空間で実行されるためです。例:
func parent() { count := 10 go func() { fmt.Println(count) // 输出 10 }() }
子ゴルーチンは、親ゴルーチンの変数に安全にアクセスして変更できます。ただし、同時実行性のため、データ競合を防ぐためにロックまたはその他の同期メカニズムを使用する必要があります。
親ゴルーチンは sync.WaitGroup
を使用して子ゴルーチンが完了するのを待つことができます。 WaitGroup
残りのサブゴルーチンの数を追跡し、Add
メソッドと Wait
メソッドを提供します:
func parent() { var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // 子 goroutine 代码 }() wg.Wait() // 等待子 goroutine 完成 }
複数のリモート URL からファイルをダウンロードする並列ファイル ダウンローダーを考えてみましょう。次のように同時ダウンロードにゴルーチンを使用できます:
func main() { var wg sync.WaitGroup urls := []string{"url1", "url2", "url3"} for _, url := range urls { wg.Add(1) go func(url string) { defer wg.Done() downloadFile(url) }(url) } wg.Wait() // 等待所有文件下载完成 }
この場合、メインのゴルーチンは各ファイルをダウンロードするための子ゴルーチンを作成します。メインの goroutine は WaitGroup
を使用してすべての子 goroutine が完了するのを待ち、すべてのファイルがダウンロードされる前にプログラムが終了しないようにします。
関数とゴルーチンの間の親子関係を理解することは、堅牢な並列 Go プログラムを構築するために重要です。変数アクセスとゴルーチンの同期メカニズムを理解することで、高パフォーマンスの同時実行アプリケーションを作成できます。
以上がgolang 関数と goroutine の親子関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。