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

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

WBOY
WBOY앞으로
2024-02-06 08:05:071083검색

루프에서 스캔하는 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으로 문의하시기 바랍니다. 삭제