> 백엔드 개발 > Golang > 고루틴은 Go Playground와 로컬 머신 사이에서 어떻게 다르게 동작합니까?

고루틴은 Go Playground와 로컬 머신 사이에서 어떻게 다르게 동작합니까?

Mary-Kate Olsen
풀어 주다: 2024-10-23 17:42:24
원래의
558명이 탐색했습니다.

How Do Goroutines Behave Differently Between Go Playground and Local Machine?

Go Playground와 내 로컬 컴퓨터의 Go 간의 불일치

문제: Go Playground의 고루틴과 로컬 컴퓨터의 고루틴

고루틴에 대한 오해를 명확히 하기 위해, 이 코드는 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>
로그인 후 복사

Go Playground에서 "프로세스가 너무 오래 걸렸습니다."라는 오류가 발생했습니다. 이는 다른 내부에서 생성된 고루틴이 무기한 실행된다는 것을 의미합니다.

그러나 동일한 코드를 로컬에서 실행하면 즉각적인 출력이 생성됩니다.

<code class="go">Hello, playground.
Finished.</code>
로그인 후 복사

이는 기본 고루틴이 종료될 때 다른 내부의 고루틴이 종료됨을 의미합니다.

설명

이 차이는 GOMAXPROCS의 기본값 때문입니다.

Go Playground에서는 GOMAXPROCS가 1로 설정됩니다. 이는 한 번에 하나의 고루틴만 실행할 수 있음을 의미합니다. 다른 고루틴이 차단되지 않으면(예: 채널 대기) 스케줄러는 다른 고루틴으로 전환하지 않습니다.

메인 고루틴이 완료된 채널을 차단하고 있으므로 스케줄러는 다음 고루틴으로 전환합니다. 다른 내부의 고루틴. 그런 다음 다른 고루틴은 무한 루프로 또 다른 고루틴을 시작합니다. GOMAXPROCS가 1이므로 기본 고루틴이 계속되지 않고 무한 루프가 계속 실행되어 시간 초과가 발생합니다.

로컬 시스템에서 GOMAXPROCS는 일반적으로 CPU 코어 수를 기본값으로 설정합니다. (예: 4 또는 8). 이를 통해 여러 고루틴을 동시에 실행할 수 있습니다. 완료 채널에서 기본 고루틴이 차단되면 스케줄러는 다른 고루틴으로 전환합니다. 이는 다른 내부의 고루틴이거나 무한 루프를 실행하는 고루틴일 수 있습니다.

메인 고루틴은 결국 종료되므로 무한 루프는 더 이상 실행되지 않습니다. 따라서 무한 루프가 완료될 때까지 기다리지 않고 프로그램이 정상적으로 종료됩니다.

결론

Go Playground에서 고루틴을 실행할 때 GOMAXPROCS의 기본값을 고려하는 것이 중요합니다. 다중 고루틴 동시성을 시뮬레이션하려면 GOMAXPROCS를 Runtime.GOMAXPROCS(2)와 같은 더 높은 값으로 명시적으로 설정하십시오. 로컬 실행에서 GOMAXPROCS의 기본 설정은 일반적으로 예상되는 동시성 동작을 허용합니다.

위 내용은 고루틴은 Go Playground와 로컬 머신 사이에서 어떻게 다르게 동작합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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