>백엔드 개발 >Golang >지속적으로 실행되는 고루틴이 Go에서 다른 고루틴을 고갈시킬 수 있습니까?

지속적으로 실행되는 고루틴이 Go에서 다른 고루틴을 고갈시킬 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-09 06:52:06265검색

Can Continuously Running Goroutines Starve Other Goroutines in Go?

고루틴 협력 스케줄링 및 잠재적 실행 기아

고루틴은 협력적으로 예약됩니다. 즉, 자발적으로 다른 고루틴에 실행을 양보합니다. 이 접근 방식은 일반적으로 공정성을 보장하지만, 양보를 자제하는 고루틴이 잠재적으로 다른 고루틴을 고갈시킬 수 있는지에 대한 의문을 제기합니다.

참조된 블로그 게시물에 따르면(http://blog.nindalf.com/how-goroutines) -work/), 양보하지 않고 계속해서 반복되는 고루틴은 실제로 동일한 스레드의 다른 고루틴을 고갈시킬 수 있습니다. 특정 스레드의 고루틴은 다중화됩니다. 즉, 네트워크 입력, 휴면 또는 채널 작업과 같은 차단 작업이 발생하더라도 스레드를 차단하지 않습니다.

예를 들어, 주어진 코드에서 "sum" 함수가 반복적으로 임의의 횟수만큼 반복하여 합계에 숫자를 추가하고 최종 결과를 인쇄합니다. 예에 표시된 대로 "go" 키워드를 사용하여 이러한 고루틴이 여러 개 생성된 경우 하나씩 실행되는지 여부는 다음 요소에 따라 달라집니다.

  • 사용 가능한 스레드 수(GOMAXPROCS ): GOMAXPROCS가 1로 설정되면 모든 고루틴은 단일 스레드에서 순차적으로 실행됩니다. starvation.
  • 수익률: sum 함수 내에는 고루틴에서 항복을 허용하는 함수 호출이나 동기화 프리미티브가 없습니다. 결과적으로, 고루틴은 완료될 때까지 스레드를 유지합니다.
  • 최근 런타임 변경 사항: 인용된 블로그 게시물은 약간 오래되었습니다. 최신 버전의 Go 런타임에서는 "fmt.Println"과 같이 명시적인 양보점이 없는 함수에 대해서도 goroutine 전환을 예약할 수 있습니다. 이는 잠재적인 고갈을 방지하기 위해 수행됩니다.

따라서 명시적인 항복이나 스케줄링을 트리거하는 함수 호출이 없는 경우 무한 루프를 실행하는 고루틴은 잠재적으로 동일한 스레드의 다른 고루틴을 고갈시킬 수 있습니다. 그러나 Go 런타임은 고루틴 실행의 균형을 맞추고 기아 상태를 방지하기 위해 적극적으로 시도한다는 점에 유의하는 것이 중요합니다.

위 내용은 지속적으로 실행되는 고루틴이 Go에서 다른 고루틴을 고갈시킬 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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