All Articles

Goroutine

Table of Contents

링크를 클릭하면 해당 내용으로 이동합니다

👩‍💻 해당 포스트는 연재 중입니다 👩‍💻

About Goroutine

Go 는 Concurrent 언어이다.
Go 에서는 동시성(병행성) 구현을 위해 goroutine 을 사용한다.
* Concurrency ≠ Parallelism 동시성과 병렬성은 다르다.
  Concurrency(동시성 / 병행성) Vs. Parallelism(병렬성) 에 관하여는 다른 포스트에서 다룰 것이다.

고루틴을 통해 한번에 여러개의 일을 동시에 실행할 수 있게 된다. 각각 실행되는 고루틴은 독립적으로서(의존적이지 않은 관계)서로에게 영향을 주지 않는다.

경량 스레드(thread)인 고루틴은 Go runtime에 의해 관리된다.
* 스레드 : 프로세스 내에서 실행되는 흐름의 단위

여기서의 경량(lightweight)은 고루틴을 생성하는데 적은 메모리가 든다는 것을 의미한다.
OS의 Thread 와 goroutine(일종의 스레드) 을 비교하였을 때 고루틴의 가벼움을 확실히 느낄 수 있다. 보통의 OS Thread 같은 경우 개당 1MB의 메모리 크기가 필요하지만 goroutine은 단지 2KB(0.002 MB) 크기로서 생성 가능하기 때문이다.
만약 기본 크기보다 더 큰 스택이 필요할 시에는 동적으로 증가하게 된다.
* Go 1.2 : goroutine의 스택사이즈는 4KB 에서 8KB로 늘어남.
* Go 1.4 : gorouitne의 스택사이즈는 8KB 에서 2KB로 줄어듬. (현재 2KB)

Go 에서는 Channel 이라는 것이 존재하는데, 이는 고루틴끼리 통신을 하기 위한 통로가 된다. go channel

↑ return to TOC

Create Goroutine

go 키워드를 통해 고루틴을 생성할 수 있다.
간단히 함수 혹은 메서드 앞에 go 키워드를 붙여주면 된다.

 go func()

* Go 런타임은 위의 고루틴을 비동기적 (asynchronously) 으로 실행시킨다.

Sound Wave Example

아래는 sync 패키지를 사용한 고루틴의 예제 코드이다.
소리를 시각화한 형태인 Sound bar 처럼 구현해보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main
 
import (
    "fmt"
    "sync"
    "time"
)
 
// Note : Keep in mind of WaitGroup (concurrent-safe counter)
// In this example I'm going to use three Methods
// (1) wg.Add   (2)wg.Done   (3)wg.Wait
var (
    wg sync.WaitGroup
)
 
var (
    shortSong = 10
)
 
var (
    wave1 = "■ 1"
    wave2 = "■■ 2"
    wave3 = "■■■ 3"
    wave4 = "■■■■ 4"
    wave5 = "■■■■■ 5"
    wave6 = "■■■■■■ 6"
)
 
 
func soundWave(s string) {
    for i := 0; i < shortSong; i++ {
        fmt.Printf("%v\n", s)
        time.Sleep(time.Millisecond * 100)
    }
    wg.Done()   // Done --> indicate to the WaitGroup that you've exited
}
 
func playMusic2() {
     wg.Add(6)
     go soundWave(wave1)
     go soundWave(wave2)
     go soundWave(wave3)
     go soundWave(wave4)
     go soundWave(wave5)
     go soundWave(wave6)
}
 
func main() {
    playMusic()
    wg.Wait()   // Wait  --> inidcate goroutines has exited
}

Line 40-45 번에서 비동기로 soundWave 라는 함수를 실행시킨다.
총 6개의 Wave는 동시에 실행되기 때문에 어떤 함수가 먼저 실행되고 끝날지는 우리는 알지 못한다. 매번 코드를 실행시킬 때마다 결과가 다르게 나올 것이다.
sound bar

main goroutine

프로그래머가 goroutine을 생성하기 전에도 goroutine은 존재한다. 이를 main goroutine이라 부른다.
즉, 모든 고 프로그램에는 최소 한개의 고루틴이 존재하는 셈이다. 추후에 프로그래머에 의해 생성되는 고루틴은 main goroutine 아래에서 돌아가게 된다.

↑ return to TOC

References

A Tour of Go | Goroutines
Go: How Does the Goroutine Stack Size Evolve?
Gorotuines-Concurrency in Golang