Golang 関数と goroutine のライフサイクル

WBOY
リリース: 2024-04-25 14:54:02
オリジナル
456 人が閲覧しました

関数のライフサイクル: 宣言とコンパイル: コンパイラーは関数の構文と型を検証します。実行: 関数が呼び出されたときに実行されます。 Return: 実行後、呼び出し元の場所に戻ります。 Goroutine のライフ サイクル: 作成と起動: go キーワードを作成して開始します。実行: タスクが完了するまで非同期で実行されます。終了: タスクは完了するかエラーが発生すると終了します。クリーンアップ: ガベージ コレクターは、完成した Goroutine が占有しているメモリをクリーンアップします。

Golang 関数と goroutine のライフサイクル

Golang 関数と Goroutine のライフ サイクル

関数のライフ サイクル

Golang では、関数は関数の作成直後にコンパイルされます。宣言され、実行時に実行が行われます。関数のライフサイクルは次のとおりです。

  1. 宣言とコンパイル:コンパイラは、関数の構文と型を解析して検証します。
  2. 実行:関数は、コードが関数呼び出しに対して実行された場合にのみ実行されます。
  3. Return:関数が実行された後、制御フローは呼び出された場所に戻ります。

Goroutine のライフサイクル

Goroutine は Go 言語の軽量スレッドです。そのライフサイクルは次のとおりです。

  1. 作成と起動:goキーワードを使用して Goroutine を作成し、すぐに起動します。
  2. 実行:Goroutine は、タスクが完了するまで非同期で実行されます。
  3. 終了:Goroutine はタスクを完了するか、エラーが発生すると終了します。
  4. クリーニング:ガベージ コレクターは、完成した Goroutine によって占有されているメモリを自動的にクリーンアップします。

実際のケース: タスクの並列実行

次のケースを考えてみましょう: 素数のリストの計算など、複数のタスクを並列で実行したいと考えています。

package main import ( "fmt" "sync" "time" ) // 函数检查给定数字是否是素数。 func isPrime(n int) bool { if n <= 1 { return false } for i := 2; i*i <= n; i++ { if n%i == 0 { return false } } return true } func main() { // 创建一个等待组以等待所有 Goroutine 完成。 var wg sync.WaitGroup // 创建和启动一个 Goroutine 来检查每个数字是否是素数。 for i := 1; i <= 100; i++ { wg.Add(1) go func(i int) { defer wg.Done() // Goroutine 完成后调用 Done() 以减少等待组计数。 if isPrime(i) { fmt.Println(i) } }(i) } // 等待所有 Goroutine 完成。 wg.Wait() }
ログイン後にコピー

この場合:

  • isPrimeこの関数は、指定された数値が素数かどうかを確認する役割を果たします。
  • main関数は、各数値が素数であるかどうかを並行してチェックするゴルーチンを作成して開始します。
  • sync.WaitGroupすべてのゴルーチンが完了する前にメイン プログラムが終了しないようにするために使用されます。
  • defer wg.Done()各ゴルーチンが完了時に待機グループのカウントをデクリメントするようにします。

以上がGolang 関数と goroutine のライフサイクルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!