答案是不会。下面让我用一个例子来验证一下,代码如下:
先写一个bash脚本,间隔1秒打印1-100到日志文件,一会供协程调用。
#/bin/bash
for ((i=1; i<=100; i++))
do
echo $i >> test_grountine.log
sleep 1
done
go主进程来监控grountine执行的外部脚本是否还在继续执行。
package main
import (
"fmt"
"os/exec"
"time"
)
// 主程序退出会不会影响子协程
func main() {
go func() {
cmd := exec.Command("bash", "test_grountine.sh")
fmt.Printf("exec %s\n", cmd.String())
data, err := cmd.CombinedOutput()
if len(data) > 0 {
fmt.Printf("%s\n", string(data))
}
if err != nil {
return
}
fmt.Println("grountine exit")
return
}()
time.Sleep(5 * time.Second)
fmt.Println("main exit")
return
}
结果如下:
go run main.go启动主程序,大概3秒后退出
tail -f test_grountine.log监控脚本是否还在执行,可以看到子协程并未受到主程序影响,子协程执行的脚本一直打印,直到脚本执行完。
由此我们可以得出,主函数的退出,不会直接影响子程序的生命周期。当然我们可以用sync.waitgroup去等待子协程执行完毕。