4

実行に 100 秒かかる child_process があります。「マスター」プログラムは child_process を生成し、それが終了するのを待つか、早期に終了します。

マスター プログラムのコード スニペットを次に示します。fmt.Println進行状況をstdinゴルーチンで確認します。「terminate」を受信すると、マスターはメッセージを child_process に渡して割り込みます。

//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」関数は、master プログラムと 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"
      }
   }

 }

現在、ゴルーチンとちゃんで動作します。

私の質問は、child_process をシグナル/キル/中断するためのより良い方法があるかどうかです。

4

1 に答える 1