>백엔드 개발 >Golang >Go에서 장기 실행 명령 출력의 진행 상황을 스트리밍하는 방법은 무엇입니까?

Go에서 장기 실행 명령 출력의 진행 상황을 스트리밍하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-14 17:30:10463검색

How to Stream the Progress of a Long-Running Command's Output in Go?

스트리밍 명령 출력 진행

질문:

긴 출력을 어떻게 스트리밍할 수 있습니까? -실행 명령, 최종 업데이트가 아닌 간헐적인 업데이트 제공 결과?

답:

bufio.ScanLines()와 함께 bufio.NewScanner() 함수를 사용하면 명령의 출력을 한 줄씩 읽을 수 있습니다. , 결과가 나오는 대로 스트리밍합니다. 다음은 제공된 코드를 기반으로 수정된 예입니다.

func main() {
    cmd := exec.Command("go", "run", "child_process.go")

    stdout, _ := cmd.StdoutPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
        log.Printf(scanner.Text())
    }

    cmd.Wait()
}

이것이 효과적으로 작동하려면 실행된 명령이 fmt.Println() 또는 log.Printf()를 사용하여 진행 상황을 출력해야 합니다.

가능한 함정:

  • 명령이 인쇄되지 않는 경우 newlines, ScanLines()는 명령이 완료된 후에만 출력을 생성합니다.
  • 기본적으로 다른 프로세스에 명시적으로 연결되지 않는 한 표준 출력 및 오류 스트림은 삭제됩니다. 이로 인해 차단 문제가 발생할 수 있으므로 두 스트림을 모두 읽는 것이 좋습니다.

대체 솔루션:

개행 문자를 신뢰할 수 없는 경우 대체 방법을 사용할 수 있습니다. 채용:

  • ScanRunes: 다음을 사용하여 개별 문자로 읽습니다. bufio.ScanRunes().
  • 수동 읽기: bufio.Scanner에 의존하지 않고 바이트 단위 또는 룬 단위 읽기.

주의:

바이트 단위 또는 룬 단위로 읽는 방법은 다음과 같습니다. 멀티바이트 UTF-8 인코딩 문자 관련 문제입니다. UTF-8 룬을 캡처할 수 있을 만큼 큰 버퍼를 사용해야 합니다.

위 내용은 Go에서 장기 실행 명령 출력의 진행 상황을 스트리밍하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.