>  기사  >  백엔드 개발  >  My Go 프로그램에서 내 고루틴이 실행되지 않는 이유는 무엇입니까?

My Go 프로그램에서 내 고루틴이 실행되지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 18:46:02571검색

Why Doesn't My Goroutine Execute in My Go Program?

고루틴 실행 이상

사용자가 Go 프로그램에서 고루틴이 실행되지 않는 당황스러운 상황에 직면했습니다. 익명 함수로 고루틴을 생성하고 기본 함수 내의 채널에 메시지를 보냈음에도 불구하고 "고루틴 입력 중..."이라는 예상 출력이 없습니다.

제공된 코드를 검사하면 고루틴이 실제로 있음이 드러납니다. 메시지 채널에 대한 포인터를 생성하고 전달했습니다. 하지만 문제는 이후 프로그램 실행 흐름에 있습니다.

동기화 누락

결정적인 문제는 메인 함수와 고루틴 간의 동기화가 없다는 것입니다. 프로그램은 고루틴이 계속 실행될 수 있는 메커니즘을 제공하지 않고 "완료!"를 인쇄한 후 종료됩니다.

Go에서는 고루틴이 메인 프로그램과 동시에 실행되도록 허용합니다. 그러나 고루틴이 작업을 완료하기 전에 주 함수가 종료되면 고루틴이 조기에 종료됩니다.

가능한 해결 방법

이 문제를 해결하려면 프로그램에서 다음을 구현해야 합니다. 주 함수가 고루틴이 완료될 때까지 기다리도록 하는 동기화 메커니즘. 이는 다양한 접근 방식을 통해 달성할 수 있습니다:

  • 채널 대기: 생성된 고루틴 수와 동일한 특정 수의 메시지를 기다리는 다른 채널을 만듭니다. 주요 기능은 모든 메시지가 수신되어 모든 고루틴의 완료를 나타낼 때까지 이 채널을 차단할 수 있습니다.
  • sync.WaitGroup: sync.WaitGroup을 사용하여 활성 고루틴 수를 추적하고 각 고루틴이 완료되면 이를 감소시킵니다. 기본 함수는 WaitGroup.Wait()를 호출하여 카운트가 0에 도달할 때까지 차단하여 모든 고루틴이 완료되도록 할 수 있습니다.
  • Select 문: select 문을 활용하여 두 항목 모두에서 입력을 기다립니다. 메시지 채널과 "완료" 채널. 메시지 채널에서 메시지가 수신되면 처리합니다. "done" 채널에서 메시지가 수신되면 메시지 채널을 닫고 고루틴을 종료합니다. 주요 기능은 프로그램 완료를 알리기 위해 "완료" 채널에 메시지를 보낼 수 있습니다.

추가 탐색

Go 블로그는 탁월한 Go의 동시성을 이해하기 위한 리소스는 다음 링크에서 찾을 수 있습니다: [Go 블로그: 동시성](https://blog.golang.org/go-concurrency-patterns).

위 내용은 My Go 프로그램에서 내 고루틴이 실행되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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