即使 main 函数终止,goroutines 也会继续运行吗?

Ayu*_*ush 0 multithreading go goroutine

我正在运行一个服务器,其中 main 触发几个 go 例程。像这样:

main() {
     go someFn(){
       // will run for infinite time()
     }
     go otherFn()
}
Run Code Online (Sandbox Code Playgroud)

我有两个疑问:

  1. 如果main函数退出了怎么办?这些线程是否仍然会运行或者会随着 main 函数而终止?

  2. 如果不是,那么让主函数永远运行/或运行直到我需要它的最佳方法是什么?目前,我正在使用select{}命令使其永远运行!有没有比这更好、更有效的方法select{}

kos*_*tix 7

我建议完整地阅读语言规范\xe2\x80\x94 Go 是极少数语言之一,其语言规范实际上可以在两顿午餐的时间内阅读(或者一次 \xe2\x80\x94 如果这是你的,我不知道,第四种编程语言的第三种)。

\n

引用

\n
\n

程序执行首先初始化main包,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非主)goroutines 完成。

\n
\n
\n

我想补充一点,逻辑上让main所有非主 goroutine 等待将是一件坏事,原因有两个:

\n
    \n
  1. 这很容易造成这样的情况:您可以等待程序关闭一段不确定的时间,即使您不希望这样(而且您并不总是希望这样)。

    \n

    从逻辑上讲,这需要发明一种“特殊”方式来结束main\xe2\x80\x94 之类的东西,例如abort(3)C,并且拥有这种方式肯定会被滥用。

    \n
  2. \n
  3. 任何实际需要等待的 goroutine 的合理使用都需要根据语言规范及其内存模型进行显式同步 \xe2\x80\x94 。
    \n也就是说,当你想要等待未完成的 goroutine 时,你必须明确地这样做。

    \n
  4. \n
\n