ホームページ >バックエンド開発 >Golang >Golang 関数と goroutine のライフサイクル

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

WBOY
WBOYオリジナル
2024-04-25 14:54:02524ブラウズ

関数のライフサイクル: 宣言とコンパイル: コンパイラーは関数の構文と型を検証します。実行: 関数が呼び出されたときに実行されます。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。