1 回答

TA贡献1842条经验 获得超12个赞
如果您希望在程序退出时终止您启动的进程,那么您可以注入一个上下文:
func Foo(ctx context.Context) {
cmd := exec.CommandContext(ctx, "command that takes a long time")
_ = cmd.Start()
return
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
Foo(ctx)
defer cancel()
panic("program quit abruptly")
}
这段代码通过创建一个带有取消函数的上下文来工作。然后将此上下文发送到Foo命令函数并从那里发送到命令函数。当cancel被调用时,上下文会被取消,导致子进程被杀死。为确保取消上下文,我们将调用推迟到cancel,这可确保在程序出于任何原因(包括恐慌)退出时取消上下文。
如果你的愿望是只在恐慌时取消,你可以main稍微修改一下:
func main() {
ctx, cancel := context.WithCancel(context.Background())
Foo(ctx)
defer func() {
if r := recover(); r != nil {
cancel()
}
}()
panic("program quit abruptly")
}
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报