我有一段代碼,例如:
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在父行程結束時將其殺死?
uj5u.com熱心網友回復:
如果您希望在程式退出時終止您啟動的行程,那么您可以注入背景關系:
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")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521013.html
標籤:去
下一篇:接收未知回應正文
