首頁 >後端開發 >Golang >golang函數與goroutine的生命週期

golang函數與goroutine的生命週期

WBOY
WBOY原創
2024-04-25 14:54:02518瀏覽

函數生命週期:宣告與編譯:編譯器驗證函式的語法和型別。執行:函數呼叫時執行。返回:執行完畢後返回呼叫位置。 Goroutine 生命週期:建立和啟動:透過 go 關鍵字建立並啟動。執行:異步運行直到完成任務。結束:任務完成或出現錯誤時結束。清理:垃圾回收器清理結束的 Goroutine 所佔用的記憶體。

golang函數與goroutine的生命週期

Golang 函數與Goroutine 的生命週期

函數的生命週期

在Golang 中,函數宣告後立即被編譯,而執行過程發生在運行時。函數的生命週期如下:

  1. 宣告與編譯:編譯器解析並驗證函數的語法和型別。
  2. 執行:當程式碼執行到函數呼叫時,函數才會被執行。
  3. 返回:函數執行完畢後,控制流程回到呼叫它的位置。

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 函數建立和啟動一個 Goroutine 來並行檢查每個數字是否為素數。
  • sync.WaitGroup 用於確保在所有 Goroutine 完成之前主程式不會退出。
  • defer wg.Done() 確保每個 Goroutine 在完成時減少等待群組計數。

以上是golang函數與goroutine的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn