이전 버전의 Go에서는 Runtime.Gosched()가 실행될 때 아래 코드에서 예기치 않은 동작이 나타났습니다. 제거됨:
package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") }
다음으로 출력 Runtime.Gosched():
hello world hello world hello world hello world hello
runtime.Gosched():
hello hello hello hello hello
GOMAXPROCS 환경 변수를 지정하지 않고 Go를 실행하면 모든 고루틴이 단일 OS 스레드에서 실행되도록 예약되어 있습니다. 프로그램을 멀티스레드로 표시하려면 Go 스케줄러가 때때로 실행 컨텍스트를 전환해야 합니다.
협력적 멀티태스킹:
Go는 협력적 멀티태스킹 모델을 사용합니다. 즉, 고루틴은 명시적으로 제어권을 양보해야 합니다. 다른 고루틴에. 이는 스케줄러가 실행 컨텍스트를 투명하게 전환하는 OS 스레드의 선점형 멀티태스킹과 대조됩니다.
runtime.Gosched()의 기능:
선점형 멀티태스킹이 없는 경우 , Runtime.Gosched()를 사용하면 고루틴이 스케줄러에 제어권을 양보할 수 있습니다. 고루틴이 Gosched 호출에 도달하면 스케줄러는 실행을 다른 고루틴으로 전환하도록 지시합니다.
제공된 예에서 Gosched를 제거한다는 것은 실행 컨텍스트가 기본 루틴을 떠나지 않는다는 것을 의미합니다. 결과적으로 "world" 고루틴은 실행이 허용되지 않으며 "world" 메시지는 인쇄되지 않습니다.
GOMAXPROCS를 양수로 설정( 예를 들어, Runtime.GOMAXPROCS(2))를 사용하면 Go가 해당 수만큼 네이티브 스레드를 생성할 수 있습니다. GOMAXPROCS가 1보다 큰 경우 고루틴은 다른 스레드에서 실행되도록 예약할 수 있어 진정한 병렬 처리가 가능합니다.
GOMAXPROCS를 2 이상으로 설정하면 예시의 고루틴이 런타임 없이도 인터리브됩니다.Gosched (), 선제적 멀티태스킹을 시연합니다.
위 내용은 단일 스레드 Go 프로그램에서 고루틴 출력을 인터리브하는 데 `runtime.Gosched()`가 중요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!