Maison >développement back-end >Golang >Comment puis-je terminer efficacement les sous-processus dans Go, y compris la gestion des délais d'attente ?
Terminer un sous-processus dans Golang
Dans Golang, le package os/exec vous permet d'exécuter des commandes externes en tant que sous-processus. Cependant, il peut y avoir des situations dans lesquelles vous devez mettre fin prématurément à un sous-processus en cours d'exécution.
Utiliser cmd.Process.Kill()
Le moyen le plus simple de tuer un sous-processus est en utilisant la méthode Kill() sur l'objet cmd.Process. Cette approche vous permet de terminer le processus immédiatement.
cmd := exec.Command("sleep", "5") if err := cmd.Start(); err != nil { log.Fatal(err) } if err := cmd.Process.Kill(); err != nil { log.Fatal("failed to kill process: ", err) }
Tuer un processus avec un délai d'attente
Parfois, vous souhaiterez peut-être limiter le temps d'exécution d'un sous-processus . Pour y parvenir, vous pouvez utiliser le package de contexte :
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() if err := exec.CommandContext(ctx, "sleep", "5").Run(); err != nil { // This will fail after 3 seconds, interrupting the 5-second sleep. }
Approche héritée avant Go 1.7
Avant Go 1.7, il n'y avait pas de package de contexte, donc un une approche plus complexe utilisant des canaux et une goroutine était nécessaire :
cmd := exec.Command("sleep", "5") if err := cmd.Start(); err != nil { log.Fatal(err) } done := make(chan error, 1) go func() { done <- cmd.Wait() }() select { case <-time.After(3 * time.Second): if err := cmd.Process.Kill(); err != nil { log.Fatal("failed to kill process: ", err) } log.Println("process killed as timeout reached") case err := <-done: if err != nil { log.Fatalf("process finished with error = %v", err) } log.Print("process finished successfully") }
En suivant ces approches, vous pouvez mettre fin efficacement aux sous-processus a commencé avec os/exec dans Golang, avec et sans contraintes de temps.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!