>  기사  >  백엔드 개발  >  고루틴이 Go 플레이그라운드와 로컬 머신에서 다르게 동작하는 이유는 무엇입니까?

고루틴이 Go 플레이그라운드와 로컬 머신에서 다르게 동작하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-23 14:56:01425검색

Why Do Goroutines Behave Differently on Go Playground vs. Local Machine?

Go Playground와 Go on Your Machine의 불일치

Go on the Go Playground와 로컬 컴퓨터의 고루틴 동작을 비교할 때 , 불일치가 발생할 수 있습니다. 근본적인 이유를 명확히 하기 위해 구체적인 예를 살펴보겠습니다.

Go Playground에서 GOMAXPROCS가 처음에 1로 설정되어 있으면 제공한 코드에서 "프로세스가 너무 오래 걸렸습니다" 오류가 발생할 것으로 예상됩니다. 이는 other() 함수 내에서 생성된 고루틴이 무한 루프를 실행하여 기본 고루틴이 계속해서 완료 채널에서 데이터를 수신하는 것을 방지하기 때문입니다.

그러나 로컬 머신에서는 GOMAXPROCS 값이 설정되어 있을 가능성이 높습니다. 더 높은 숫자로(예: 사용 가능한 CPU 코어 수) 이를 통해 여러 고루틴을 동시에 실행할 수 있습니다. 귀하의 경우, 메인 고루틴은 완료 채널로부터 데이터를 수신하는 반면 다른 고루틴은 무한 루프를 병렬로 실행합니다. 데이터가 수신되면 기본 고루틴은 실행 중인 다른 고루틴에 관계없이 프로그램을 진행하고 종료합니다.

이러한 비결정적 동작은 Go 메모리 모델에 내재되어 있습니다. 명시적인 동기화 메커니즘을 사용하지 않는 한 고루틴 실행 순서는 보장되지 않습니다.

설명:

Go Playground에서 GOMAXPROCS는 1로 설정됩니다. 이는 즉 한 번에 하나의 고루틴만 실행할 수 있습니다. 코드에서 기본 고루틴은 main() 함수를 실행하고 other() 함수를 실행하는 두 번째 고루틴을 생성합니다. 그런 다음 메인 고루틴은 차단된 완료 채널을 기다립니다.

한 번에 하나의 고루틴만 실행할 수 있으므로 스케줄러는 other() 함수를 계속 실행하도록 선택합니다. 이 함수는 완료 채널에 값을 전송하여 현재(other())와 기본 고루틴을 모두 실행 가능하게 만듭니다. 그러나 스케줄러는 GOMAXPROCS=1.

Other()가 무한 루프를 실행하는 또 다른 고루틴을 시작하므로 other()를 계속 실행합니다. 스케줄러는 차단 상태에 도달하는 데 시간이 오래 걸리는 이 고루틴을 실행하기로 선택합니다. 결과적으로 main() 함수가 계속되지 않고 프로그램이 무한정 실행되어 Go Playground에 "Process take too long" 오류가 표시됩니다.

로컬에서는 GOMAXPROCS가 1보다 클 가능성이 높습니다. 동시에 실행되는 고루틴. other()가 done 채널로 데이터를 보내면 스케줄러는 메인 고루틴으로 전환하여 프로그램을 종료하고 종료할 수 있습니다. 다른 고루틴이 계속 실행 중이더라도 메인 고루틴이 종료되면 프로그램도 종료됩니다.

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

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