>백엔드 개발 >Golang >go 루틴이 왜 이렇게 동작하는 걸까요?

go 루틴이 왜 이렇게 동작하는 걸까요?

WBOY
WBOY앞으로
2024-02-08 23:30:10769검색

为什么 go 例程会有这样的行为?

php 편집자 Xigua가 "바둑 루틴 동작의 이유"에 대한 귀하의 질문에 답변해 드립니다. Go 언어의 루틴(goroutine)은 동시 실행 효과를 얻을 수 있는 경량 동시성 메커니즘입니다. 그러나 어떤 경우에는 go 루틴의 동작으로 인해 예상치 못한 결과가 발생할 수 있습니다. 이는 주로 go 루틴의 스케줄링 메커니즘과 메모리 모델의 특성 때문입니다. Go 언어의 일상적인 동작을 깊이 이해하기 전에 이러한 기능과 프로그램 동작에 미치는 영향을 이해해야 합니다.

질문 내용

"Go in action"이라는 책을 읽고 있는데 책의 고루틴 부분에 대해 약간 혼란스러워요. 기본적으로 다음 코드에 대해 두 가지를 알고 싶습니다.

으아악

출력은 다음과 같습니다.

으아악
  1. 고루틴 B를 먼저 실행하는 이유는 무엇인가요? 코드에서는 고루틴 A가 먼저 오기 때문에, 나도 고루틴이 먼저 실행되기를 원합니다.
  2. goroutine B는 .Gosched 메서드를 사용하여 goroutine A가 실행을 시작하도록 하지만 뮤텍스가 잠겨 있으므로 goroutine A는 잠금이 해제될 때까지 기다립니다. 이때 GOMAXPROCS에 논리 프로세서가 하나만 있도록 설정했습니다. 두 개의 고루틴이 병렬로 실행되는 것처럼 보이는 이유는 무엇입니까? 정말 이런 일이 일어나야 할까요?

내가 말했듯이 gomaxprox를 1로 설정하면 한 번에 하나의 고루틴만 실행할 수 있지만 이 경우에는 그렇지 않은 것 같습니다. 실제로 두 고루틴이 병렬로 실행됩니다.

Solution

고루틴은 동시에 실행됩니다. 이는 사용 가능한 프로세서가 있는 경우 스케줄러가 프로세서가 병렬로 실행되도록 예약할 수 있음을 의미합니다. 하나의 프로세서만 사용할 수 있는 경우에도 동시에 실행되지만 주어진 순간에는 하나의 고루틴만 실행됩니다.

Go 런타임은 어떤 고루틴이 먼저 실행될지 보장하지 않습니다. 따라서 새로 생성된 고루틴 세트의 실행 순서는 무작위입니다.

위 내용은 go 루틴이 왜 이렇게 동작하는 걸까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제