yoongrammer

고루틴(goroutine) 이란? 본문

언어/Go 언어

고루틴(goroutine) 이란?

yoongrammer 2020. 11. 4. 18:10
728x90

목차

    고루틴(goroutine) 이란?


    고루틴(goroutine)이란, 프로그램에 있는 다른 고루틴과 관련하여 독립적으로 동시에 실행되는 함수입니다.

    즉, Go 언어로 동시에 실행되는 모든 활동을 고루틴이라고 합니다.

     

    고 루틴을 만드는 비용은 스레드에 비해 매우 적기 때문에 경량 스레드라고 합니다.

    모든 프로그램은 적어도 하나의 main함수라는 고루틴을 포함하고 고루틴은 항상 백그라운드에서 작동합니다.

     

    메인 함수가 종료되면 모든 고루틴은 종료됩니다. 따라서 고루틴보다 main이 먼저 종료되는 것을 방지해야 합니다.

     

    고루틴(goroutine) 사용 방법


    Go 언어에서는 단일 프로그램에서 여러 고루틴을 만들 수 있습니다.
    고루틴은 prefix로 go키워드를 사용해 간단히 만들 수 있는데 일반 함수와 익명 함수로 만들 수 있습니다.

    package main
    
    import (
    	"fmt"
    )
    
    func display(str string) {
      for i := 0; i < 3; i++ {
        fmt.println(str)
      }
    }
    
    func displayMain(str string) {
      for i := 0; i < 3; i++ {
        fmt.println(str)
      }
    }
    
    func main() {
      // 일반 함수로 고루틴 생성
      go display("Welcome")
    
      // 익명 함수로 고루틴 생성
      go fun() {
        for i := 0; i < 3; i++ {
          fmt.Println("to")
        }
      }
    	
      displayMain("yoongrammer")
    }

     

    Output:

    yoongrammer
    yoongrammer
    yoongrammer
    

    출력 결과를 보면 고루틴 결과가 제대로 출력되지 않은 것을 볼 수 있습니다.

    이유는 고루틴보다 메인 함수가 먼저 종료되었기 때문입니다.

     

    간단히 sleep을 이용하여 해결해 보도록 하겠습니다.

    package main
    
    import ( 
      "fmt"
      "time"
    )
    
    func display(str string) {
      for i := 0; i < 3; i++ {
        time.Sleep(50 * time.Millisecond)
        fmt.println(str)
      }
    }
    
    func displayMain(str string) {
      for i := 0; i < 3; i++ {
    	time.Sleep(70 * time.Millisecond)
        fmt.println(str)
      }
    }
    
    func main() {
      // 일반 함수로 고루틴 생성
      go display("Welcome")
    
      // 익명 함수로 고루틴 생성
      go fun() {
        for i := 0; i < 3; i++ {
          time.Sleep(60 * time.Millisecond)
          fmt.Println("to")
        }
      }
    	
      displayMain("yoongrammer")
    }

     

    Output:

    Welcome
    to
    yoongrammer
    Welcome
    to
    yoongrammer
    Welcome
    to
    yoongrammer

    순서대로 출력되는 것을 확인할 수 있습니다.

     

    수행 흐름은 아래와 같습니다.

    고루틴은 동시에 수행되기 때문에 동기화가 중요합니다.

     

    고루틴끼리 데이터를 주고받아야 하는 경우가 생긴다면 어떻게 해야 할까요?

    바로 채널(Channel)을 사용하면 되는데 채널은 다음에 다루도록 하겠습니다.

     

    728x90

    '언어 > Go 언어' 카테고리의 다른 글

    gdlv - Go언어 디버거  (0) 2020.11.22
    Delve - Go언어 디버거  (0) 2020.11.13
    [Go] 채널 방향, 채널 버퍼링, Select  (0) 2020.11.06
    [Go] 채널(Channel) 이란?  (0) 2020.11.05
    Go 언어 설치  (0) 2020.11.03
    Comments