等待 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中文網其他相關文章!