고루틴에 대한 오해를 명확히 하기 위해, 이 코드는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!