>백엔드 개발 >Golang >Go 고루틴 동작이 플레이그라운드와 로컬 실행 사이에서 다른 이유는 무엇입니까?

Go 고루틴 동작이 플레이그라운드와 로컬 실행 사이에서 다른 이유는 무엇입니까?

DDD
DDD원래의
2024-10-23 14:35:33496검색

Why Do Go Goroutine Behaviors Differ Between the Playground and Local Execution?

Go Playground와 로컬 머신 실행 간의 불일치 동작

Background

고루틴에 대한 오해를 풀기 위해 한 사용자가 Go Playground를 방문했습니다. 그리고 다음 코드를 실행했습니다:

<code class="go">package main

import (
    "fmt"
)

func other(done chan bool) {
    done <- true
    go func() {
        for {
            fmt.Println("Here")
        }
    }()
}

func main() {
    fmt.Println("Hello, playground")
    done := make(chan bool)
    go other(done)
    <-done
    fmt.Println("Finished.")
}</code>

Observed Outcomes

Go Playground:

  • 오류가 발생했습니다: "프로세스가 너무 오래 걸렸습니다. ."
  • 다른 내부의 고루틴이 영구적으로 실행됨을 암시합니다.

로컬 실행:

  • 생산된 출력은 거의 즉시:

    Hello, playground.
    Finished.
  • 메인 고루틴이 완료되면 다른 고루틴이 종료됨을 나타냅니다.

설명

Go Playground:

  • 기본 GOMAXPROCS는 1로 설정됩니다.
  • 한 번에 하나의 고루틴만 실행되어 고루틴이 비차단일 때 스케줄러 전환을 방지합니다.
  • 완료된 채널의 메시지를 기다리는 동안 기본 고루틴이 차단됩니다.
  • 다른 내부의 고루틴이 무기한 실행되어 시간 초과가 발생합니다.

로컬 실행:

  • GOMAXPROCS는 CPU 코어 수로 설정될 가능성이 높으며 일반적으로 기본값은 1보다 큰 값입니다.
  • 스케줄러는 고루틴 간에 전환하여 기본 고루틴이 비활성 상태에서도 진행될 수 있도록 합니다. -동시에 실행되는 고루틴을 차단합니다.
  • main()이 종료되면 무기한 실행 중인 고루틴이 완료될 때까지 기다리지 않고 프로그램이 종료됩니다.

비결정적 동작

Go Playground는 현재 캐시된 버전의 출력을 사용하므로 후속 실행이 실제 실행을 정확하게 반영하지 않을 수 있습니다.

결론

GOMAXPROCS가 goroutine 실행에 미치는 영향을 이해하는 것은 설계에 매우 중요합니다. 적절한 동시성 모델. Go Playground의 기본 설정은 항상 로컬 시스템의 동작을 모방하지 않을 수 있으므로 다양한 구성에서 테스트하는 것이 중요합니다.

위 내용은 Go 고루틴 동작이 플레이그라운드와 로컬 실행 사이에서 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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