首页 >后端开发 >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