>  기사  >  백엔드 개발  >  golang에서 코루틴을 종료하는 방법

golang에서 코루틴을 종료하는 방법

(*-*)浩
(*-*)浩원래의
2019-12-27 11:14:584986검색

golang에서 코루틴을 종료하는 방법

goroutine과 채널은 Go 언어의 뛰어난 기능으로 매우 가볍고 사용하기 쉬운 동시성 기능을 제공합니다. 하지만 애플리케이션 프로세스에 고루틴이 많으면 기본 프로세스에서 모든 고루틴이 종료될 때까지 어떻게 기다려야 할까요?

1 채널 을 통해 종료 신호를 전달합니다. >                                                  # 즉, 공유 메모리를 통해 데이터를 공유하는 것이 아니라 채널을 통해 데이터를 공유합니다. 기본 프로세스는 다음과 같이 채널을 통해 모든 고루틴에 중지 신호를 보낼 수 있습니다.

func run(done chan int) {
        for {
                select {
                case <-done:
                        fmt.Println("exiting...")
                        done <- 1
                        break
                default:
                }
 
                time.Sleep(time.Second * 1)
                fmt.Println("do something")
        }
}
 
func main() {
        c := make(chan int)
 
        go run(c)
 
        fmt.Println("wait")
        time.Sleep(time.Second * 5)
 
        c <- 1
        <-c
 
        fmt.Println("main exited")
}
이 방법은 고루틴을 정상적으로 중지할 수 있지만, 고루틴이 너무 많으면 이 방법이 작동하지 않습니다. 코드가 미학적으로나 관리적으로나 투박해 보입니다.

2 waitgroup 사용

sync 패키지의 Waitgroup 구조는 Go 언어에서 제공하는 여러 고루틴 간의 동기화를 위한 좋은 도구입니다. 다음은 공식 문서의 설명입니다:

일반적으로 우리는 waitgroup을 다음과 같이 사용합니다:

Create an 인스턴스 of Waitgroup, 가정해보자 call it wg각 고루틴이 시작되면 wg.Add(1)이 호출됩니다. 이 작업은 고루틴이 시작되기 전에 호출되거나 고루틴 내부에서 호출될 수 있습니다. 물론, n개의 고루틴을 생성하기 전에 wg.Add(n)를 호출할 수도 있습니다

각 고루틴이 작업을 완료하면 wg.Done()을 호출하세요

Waiting for all The goroutine은 wg.Add(1)을 실행한 모든 goroutine이 wg.Done()을 호출하기 전에 차단되는 wg.Wait()를 호출합니다. 모든 goroutine이 wg.Done()을 호출한 후에 반환됩니다.

위 내용은 golang에서 코루틴을 종료하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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