猿问

可以退出带有活动 goroutine 的程序吗?

取以下代码片段:


func main() {

    ch := make(chan int)

    quit := make(chan int)

    go func() {

        for {

            ch <- querySomePeriodicThing()

        }

    }()


    // ...


loop:

    for {

        select {

        case <-ch: handlePeriodicThing()

        case <-quit: break loop

        }

    }

}

goroutine 应该在执行期间运行。当 select 语句从退出通道接收到一些东西时,它会跳出循环并结束程序,而不会尝试停止 goroutine。


我的问题:这是否会产生任何间歇性的不良影响,而这些不良影响在运行一次或两次时并不明显?我知道在其他语言中,线程应该在程序结束之前清理(即退出),但是会有所不同吗?假设querySomePeriodicThing()不打开文件描述符或套接字或任何不打开的东西。


繁星淼淼
浏览 201回答 2
2回答

缥缈止盈

如规范中所述,您的程序将在main函数完成时退出:程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非main)goroutine 完成。因此,从语言的角度来看,您还有其他 goroutine 仍在运行这一事实并不是问题。根据您的程序在做什么,它可能仍然是一个问题。如果 goroutine 创建了一些应该在程序退出前清理的资源,那么在中途停止执行可能是一个问题:在这种情况下,你应该让你的main函数先等待它们完成。没有等价于pthread_join,因此您需要自己编写代码(例如,通过使用频道或sync.WaitGroup)。请注意,对于某些资源会在进程退出时由操作系统自动清理(例如打开文件、文件锁等),因此在某些情况下不需要特殊清理

慕运维8079593

Goroutines 不是线程,它们非常轻量级,当它们不再运行或程序退出时,运行时会自动清理它们。
随时随地看视频慕课网APP

相关分类

Go
我要回答