>  기사  >  백엔드 개발  >  Golang의 os.Stdout에 대한 동시 쓰기는 안전하고 결정적인가요?

Golang의 os.Stdout에 대한 동시 쓰기는 안전하고 결정적인가요?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 18:31:03151검색

Is Concurrent Writing to os.Stdout in Golang Safe and Deterministic?

Golang에서 표준 출력에 쓰기 위한 동시성 고려 사항

질문:

os에 출력을 동시에 쓰는 것이 안전한가요? .여러 고루틴에서 Stdout을 사용하시겠습니까?

코드 샘플:

<code class="go">package main

import (
    "fmt"
    "os"
    "strings"
)

func main() {
    x := strings.Repeat(" ", 1024)
    go func() {
        for {
            fmt.Fprintf(os.Stdout, x+`aa\n`)
        }
    }()

    go func() {
        for {
            fmt.Fprintf(os.Stdout, x+`bb\n`)
        }
    }()

    go func() {
        for {
            fmt.Fprintf(os.Stdout, x+`cc\n`)
        }
    }()

    go func() {
        for {
            fmt.Fprintf(os.Stdout, x+`dd\n`)
        }
    }()

    <-make(chan bool)
}</code>

답변:

제공된 코드는 결과가 나오지 않습니다. 데이터 경주에서. 그러나 os.Stdout에 기록되는 데이터의 순서는 비결정적이며 실행마다 다를 수 있습니다.

설명:

  • fmt의 함수 패키지는 동시 사용에 안전합니다. 즉, 동시 호출을 처리하도록 설계되었습니다.
  • os.Stdout은 io.Writer 인터페이스를 구현합니다. 그러나 io.Writer 인터페이스는 동시성 동작을 지정하지 않습니다.
  • 실제로 Unix 계열 시스템에서 os.Stdout는 일반적으로 쓰기 작업에 대해 원자적인 파일 설명자를 래핑합니다. 즉, 여러 고루틴에서 os.Stdout에 쓰기 작업을 해도 데이터가 손상되거나 중복되지 않습니다.
  • 그러나 데이터가 os.Stdout에 기록되는 순서는 커널과 하드웨어에 따라 결정됩니다. 데이터가 순서대로 기록된다는 보장은 없습니다.

권장 사항:

  • 정렬된 출력을 보장하려면 sync.Mutex 유형을 사용하세요. os.Stdout에 대한 액세스를 직렬화합니다.
  • 또는 동기화된 로깅 기능을 제공하는 fmt 대신 로그 패키지를 사용하는 것이 좋습니다.

위 내용은 Golang의 os.Stdout에 대한 동시 쓰기는 안전하고 결정적인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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