Go 플레이그라운드에서 코드를 실행할 때 개발자는 로컬 머신에서 동일한 코드를 실행할 때와 비교하여 불일치를 경험할 수 있습니다. 이 기사에서는 특히 고루틴과 동기화 메커니즘을 다룰 때 동작의 차이점을 살펴봅니다.
다음 Go 코드를 고려하세요.
<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.") }
Go 플레이그라운드에서 이 코드는 "프로세스가 너무 오래 걸렸습니다."라는 오류를 생성합니다. 이는 다른 함수 내에서 생성된 고루틴이 무기한 실행된다는 것을 의미합니다.
그러나 여러 CPU 코어(GOMAXPROCS > 1)가 있는 로컬 시스템에서 동일한 코드를 실행하면 다음과 같은 출력이 생성됩니다.
<code class="text">Hello, playground Finished.</code>
이것은 메인 고루틴이 끝나면 other 내에서 생성된 고루틴이 종료된다는 것을 의미합니다.
Go 놀이터와 로컬 머신 간의 다른 동작은 사용 가능한 프로세서 수. Go 플레이그라운드에서 GOMAXPROCS의 기본값은 1입니다. 이는 한 번에 하나의 고루틴만 실행할 수 있음을 의미합니다. 따라서 위의 예에서 other 내에 생성된 무한 고루틴은 기본 고루틴이 계속되는 것을 방지합니다.
반대로 여러 CPU 코어로 로컬에서 실행할 때 GOMAXPROCS는 기본적으로 사용 가능한 코어 수를 지정하여 여러 고루틴을 허용합니다. 동시에 실행합니다. 따라서 other 내에 생성된 무한 고루틴은 기본 고루틴 종료를 차단하지 않습니다.
Go에서 고루틴의 동작은 사용 가능한 프로세서(GOMAXPROCS) 수에 따라 달라집니다. Go 플레이그라운드에서는 고루틴이 무한정 실행되는 것으로 인식될 수 있는 기본값 1을 사용하지만, 여러 코어가 있는 로컬 시스템에서 동일한 코드를 실행하면 기본 고루틴이 완료될 때 고루틴이 종료될 수 있는 다른 동작을 제공합니다. 이러한 이해는 개발자가 오해를 피하고 코드가 다양한 환경에서 예상대로 작동하도록 하는 데 도움이 됩니다.
위 내용은 고루틴 on Go 플레이그라운드와 로컬 머신이 동작 차이를 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!