Goroutine


Goroutine(고루틴) 개념

Go루틴, 또는 goroutine(고루틴)은 Go 런타임에 의해 관리되는 경량화된 스레드이다. 

고루틴을 활용하면 다른 함수나 메소드 선언 없이 편리하게 여러 함수를 동시 실행할 수 있다. 

OS 스레드를 직접 사용하는 것에 비해 훨씬 적은 비용이 들기 때문에, Go 애플리케이션은 수천개의 고루틴을 동시에 실행할 수 있다. 


스레드와 비교했을 때의 장점

1. 스레드에 비해 고루틴은 절대적으로 적은 비용만 든다. 수 kb정도의 스택만 필요하며, 필요에 따라 확장/수축이 가능하다. 

2. 소수의 스레드에 의해 고루틴 다수를 다중화하여 사용할 수 있다. 수천개의 고루틴을 하나의 스레드 만으로 사용할 수도 있다. 

3. 고루틴은 채널을 활용해서 통신한다. 채널은 여러개의 고루틴이 동시에 공유 메모리에 접속할 때 경합하지 않도록 설계되어있다. 


고루틴 예시

선언된 함수 앞에 go 키워드를 붙여서 호출하면 새로운 goroutine에 의해 함수가 호출된다. 

# 현재 goroutine에서 함수 evaluation이 이뤄진다.
# Function
f(x,y,z)

# "go"키워드에 의해 새로운 goroutine이 생성되며, 이 goroutine에 의해 함수가 호출된다.
# goroutine running function
go f(x,y,z)

main function 역시 하나의 고루틴에 의해 실행되며, 이전의 고루틴의 종료 여부와 관계 없이 메인 고루틴이 종료되면 return한다. 다음 예제를 실행하면 main에 의한 출력만 나타난다. 

package main

import (
   "fmt"
)

func sarc() {
   fmt.Println("sarc.io goroutine")
}
func main() {
   go sarc()
   fmt.Println("This is Main")
}

Output:

This is Main

Sarc Function의 프린트문까지 출력하기 위해 메인함수가 리턴하기 전에 sleep 텀을 준다. 

package main

import (
   "fmt"
   "time"
)

func sarc() {
   fmt.Println("sarc.io goroutine")
}
func main() {
   go sarc()
   time.Sleep(1 * time.Second) #sarc의 고루틴이 수행될 시간을 벌어준다.
   fmt.Println("This is Main")
}

Output:

sarc.io goroutine
This is Main

다중 고루틴 예시

다중 고루틴을 이해하기 위해 아래와 같은 펑션 2개를 구성한다. sarc 펑션은 100ms마다 출력하고, tech 펑션은 150ms마다 출력한다. 

package main

import (
   "fmt"
   "time"
)

func sarc() {
   var cur = 0
   for i := 1; i <= 5; i++ {
      time.Sleep(100*time.Millisecond)
      cur += 100
      fmt.Println("sarc", i, "current:",cur,"ms")
   }
}

func tech() {
   var cur=0
   for i := 1; i <= 5; i++ {
      time.Sleep(150*time.Millisecond)
      cur += 150
      fmt.Println("tech", i,"current:",cur,"ms")
   }
}

func main() {
   go sarc()
   go tech()
   time.Sleep(3 * time.Second)
   fmt.Println("Main has been terminated")
}

Output:

sarc 1 current: 100 ms
tech 1 current: 150 ms
sarc 2 current: 200 ms
tech 2 current: 300 ms
sarc 3 current: 300 ms
sarc 4 current: 400 ms
tech 3 current: 450 ms
sarc 5 current: 500 ms
tech 4 current: 600 ms
tech 5 current: 750 ms
Main has been terminated

Output을 보면, 2개의 고루틴이 동시성을 가지고 수행됨에 따라 예상한 순서대로 출력됨을 확인할 수 있다.