gpt4 book ai didi

go - 可以退出带有事件 goroutine 的程序吗?

转载 作者:IT老高 更新时间:2023-10-28 13:05:11 26 4
gpt4 key购买 nike

获取以下代码片段:

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 语句从退出 channel 接收到一些东西时,它会跳出循环并且程序结束,没有任何尝试停止 goroutine。

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

最佳答案

As mentioned in the spec ,您的程序将在 main 函数完成时退出:

Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.

因此,从语言的角度来看,您还有其他 goroutine 仍在运行这一事实不是问题。这可能仍然是一个问题,具体取决于您的程序正在做什么。

如果 goroutine 创建了一些应该在程序退出之前清理的资源,那么中途停止执行可能是一个问题:在这种情况下,你应该让你的 main 函数等待让他们先完成。没有与 pthread_join 等效的代码,因此您需要自己编写代码(例如,通过使用 channel 或 sync.WaitGroup)。

请注意,某些资源会在进程退出时由操作系统自动清理(例如打开的文件、文件锁定等),因此在某些情况下不需要特殊清理

关于go - 可以退出带有事件 goroutine 的程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com