首頁 >後端開發 >Golang >如何確保 Go 例程在主退出前完成?

如何確保 Go 例程在主退出前完成?

DDD
DDD原創
2024-12-09 16:33:14779瀏覽

How to Ensure Go Routines Complete Before Main Exits?

等待 Go 程式完成

在 Go 中,常見的做法是使用 goroutine 來執行並發任務。為了確保主程式在退出之前等待所有 goroutine 完成,以實現適當的同步機制至關重要。

問題中提到的一種方法涉及使用布林通道(完成):

func do_stuff(done chan bool) {
    fmt.Println("Doing stuff")
    done <- true
}
func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
}

為什麼

操作

取消註解main 中的最後一行會導致死鎖:

這一秒鐘會導致死鎖:

func main() {
    fmt.Println("Main")
    done := make(chan bool)
    go do_stuff(done)
    <-done
    // <-done
}

這一秒鐘

使用sync套件的替代同步方法:

對於更複雜的場景,sync套件提供替代同步原語。在提供的程式碼中,sync.WaitGroup可以有效地追蹤goroutine完成情況:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            longOp()
            wg.Done()
        }()
    }
    // will wait until wg.Done is called 10 times (10 goroutines finish)
    wg.Wait()
}

func longOp() {
    time.Sleep(time.Second * 2)
    fmt.Println("long op done")
}

使用sync.WaitGroup確保main在退出程式之前等待所有10個goroutine完成。

以上是如何確保 Go 例程在主退出前完成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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