1 回答

TA貢獻1842條經驗 獲得超13個贊
如果您希望在程序退出時終止您啟動的進程,那么您可以注入一個上下文:
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 關注
- 147 瀏覽
添加回答
舉報