У меня есть child_process, для выполнения которого требуется 100 секунд. Программа «master» будет порождать дочерний_процесс и либо ждет его завершения, либо завершает его раньше.как прервать дочерний процесс с golang goroutine
Вот фрагмент кода основной программы. Это fmt.Println
прогресс и проверить его stdin
с goroutine. Как только «завершение» получено, мастер передает сообщение дочернему_процессу, чтобы прервать его.
//master program
message := make(chan string)
go check_input(message)
child_process := exec.Command("child_process")
child_stdin := child_process.StdinPipe()
child_process.Start() //takes 100 sec to finish
loop:
for i=:1;i<=100;i++ {
select {
case <- message:
//end child process
child_stdin.Write([]byte("terminate\n"))
break loop
case <- time.After(1*time.Second):
fmt.Println(strconv.ItoA(i) + " % Complete") // update progress bar
}
child_process.Wait() //wait for child_process to be interrupted or finish
Функция «check_input» используется как в основной программе, так и в child_process. Он получает сообщение «прекратить» из stdin.
//check_input function
func check_input(msg chan string){
reader := bufio.NewReader(os.Stdin)
for {
line, err := reader.ReadString('\n')
if err != nil {
// You may check here if err == io.EOF
break
}
if strings.TrimSpace(line) == "terminate" {
msg <- "terminate"
}
}
}
В настоящее время он работает с goroutine и chan.
Мой вопрос в том, есть ли лучший способ сигнализировать/убивать/прерывать child_process.
'child_process.Process.Kill()' или 'child_process.Process.Signal (os.Interrupt)', если вы хотите быть перекрестной платформой ... –
, пожалуйста, позвольте мне спросить, получит ли child_process сигнал kill и есть время, чтобы очистить себя перед смертью. –
Не с kill, а с 'child_process.Process.Signal (os.Interrupt)'. Однако вы должны подумать о том, чтобы убить его, если он не закончится сам после отправки прерывания –