我有一段围棋代码,比如:
func Foo() {
cmd := exec.Command("command that takes a long time")
err = cmd.Start()
if err != nil {
panic(err)
}
return
}
func main() {
Foo()
panic("program quit abruptly")
}
即使主进程结束了,sleep命令仍将处于活动状态,是否可以将它们链接起来,以便在父进程被终止时cmd
将被终止?
1条答案
按热度按时间oaxa6hgo1#
如果您希望在程序退出时终止启动的进程,则可以注入一个上下文:
这段代码的工作原理是创建一个带有cancel函数的上下文。然后,这个上下文被发送到
Foo
,并从那里发送到command函数。当cancel
被调用时,上下文将被取消,导致子进程被杀死。为了确保上下文被取消,我们延迟了对cancel
的调用,这确保了当程序由于任何原因退出时,上下文被取消。包括恐慌。如果您希望仅在出现紧急情况时取消,则可以稍微修改
main
: