프로세스를 시작하고 출력을 모니터링하기 위해 golang을 사용하고 있습니다. 프로세스는 오랜 시간 동안 실행되므로 프로세스를 종료하려면 신호를 보낼 수 있어야 합니다.
대부분의 경우 잘 작동하는 다음 코드가 있습니다. 그러나 어떤 이유로 프로세스에 출력이 없을 수 있으며 for 루프는 scan()
方法阻塞,无法接收来自processfinishchan
메시지를 받게 됩니다.
scan()
方法设置超时?我尝试了一个解决方案,在另一个 goroutine 中运行 scan()
,并使用另一个 select 从新的 goroutine 和超时通道接收,但考虑到外部 for
循环,是否会有越来越多的 goroutine 被 scan
를 쉽게 차단할 수 있는 방법이 있나요? p>
// code that start the process... scanner := bufio.NewScanner(stdout) for { select { case <-processFinishChan: // send to this channel to terminate the process log.Println("Killing Process") err := cmdObject.Process.Kill() if err != nil { log.Printf("Error Killing: %v", err) } else { return } default: // default case, read the output of process and send to user. if !scanner.Scan() && scanner.Err() == nil { // reach EOF return } m := scanner.Bytes() WSOutChanHolder.mu.Lock() for _, ch := range WSOutChanHolder.data { ch <- m } WSOutChanHolder.mu.Unlock() } }
stdout
是 cmdobject.stdoutpipe()
의 결과를 가정하면 리더는 프로세스가 종료된 후 기다리는 동안 리더를 닫고 진행 중인 읽기를 중단해야 합니다.
wait는 명령 종료를 확인한 후 파이프를 닫으므로 대부분의 호출자는 파이프를 직접 닫을 필요가 없습니다.
따라서 별도의 고루틴에서 프로세스를 종료해야 하며 프로세스를 종료한 후 기다려야 합니다. 일어나는 것을 지켜보고 판독기를 닫습니다.
위 내용은 루프에서 스캔하는 bufio 스캐너의 시간 초과를 설정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!