루프에서 스캔하는 bufio 스캐너의 시간 초과를 설정하는 방법은 무엇입니까?

WBOY
풀어 주다: 2024-02-06 08:05:07
앞으로
1071명이 탐색했습니다.

루프에서 스캔하는 bufio 스캐너의 시간 초과를 설정하는 방법은 무엇입니까?

질문 내용

프로세스를 시작하고 출력을 모니터링하기 위해 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()
    }
}
로그인 후 복사


정답


stdoutcmdobject.stdoutpipe()의 결과를 가정하면 리더는 프로세스가 종료된 후 기다리는 동안 리더를 닫고 진행 중인 읽기를 중단해야 합니다.

wait는 명령 종료를 확인한 후 파이프를 닫으므로 대부분의 호출자는 파이프를 직접 닫을 필요가 없습니다.

따라서 별도의 고루틴에서 프로세스를 종료해야 하며 프로세스를 종료한 후 기다려야 합니다. 일어나는 것을 지켜보고 판독기를 닫습니다.

으아악

위 내용은 루프에서 스캔하는 bufio 스캐너의 시간 초과를 설정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿