Golang

[GoLang 시작하기 9] Go루틴

여니여니_ 2020. 4. 9. 23:03

Muscle Gopher

 

Go루틴

 

Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다.

 

고루틴은 비동기적으로(asynchronously) 함수 루틴을 실행하여
여러 코드를 동시에(concurrently) 실행하는데 사용된다.

 

다음 그림은 main함수가 실행될 때 함수 1, 2, 3이 순차적으로 실행되는 것을 표현한 것이다. 

함수 하나가 실행되는 데에 10초가 소요된다고 가정하면, 완료하는 데에는 30초가 필요할 것이다.

 

그런데 고루틴을 활용하여 이렇게 병렬적으로 처리할 수 있으면 함수는 10초밖에 소요되지 않는다.

 

다음 예제들을 살펴보자.

 

#1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    timeCount("number1")
    timeCount("number2")
}
 
func timeCount(name string) {
    for i := 0; i < 10; i++ {
        fmt.Println(name, ":", i)
        time.Sleep(time.Second)
    }
}
 

 

timeCount 함수는 그러면 1초마다 숫자를 하나씩 출력한다.

 

 

결과

 

그러면 프로그램은 일반적으로 위와 같이 number1의 카운트가 모두 끝나고 number2 카운트가 시작된다. 

 

#2

그러면 go 루틴을 사용해보자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    go timeCount("number1")
    timeCount("number2")
}
 
func timeCount(name string) {
    for i := 0; i < 10; i++ {
        fmt.Println(name, ":", i)
        time.Sleep(time.Second)
    }
}
 

 

main 함수에서 첫번째 timeCount 함수를 실행시킬 때 앞에 go를 붙여 고루틴을 사용한다.

 

 

결과

그러면 위 결과를 보면 number1과 number2가 동시에 실행된다는 것을 알 수 있다. 

 

#3

두 함수에 모두 go를 붙여보면 어떨까?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    go timeCount("number1")
    go timeCount("number2")
}
 
func timeCount(name string) {
    for i := 0; i < 10; i++ {
        fmt.Println(name, ":", i)
        time.Sleep(time.Second)
    }
}
 

 

(출력 없음)

결과는 출력이 되지 않는다. 

main 함수가 그냥 끝나버린다.

 

고루틴은 프로그램이 실행되는 동안만 실행된다. 

main은 첫번째 고루틴을 실행하고, 두번째 고루틴을 실행하고 끝나버린다.

main함수는 Go루틴을 기다려주지 않는다. main함수가 끝나면 Go루틴도 소멸된다. 

2번 예제에서 Go루틴이 실행될 수 있었던 것은 Go루틴이 아닌 number2의 count가 실행되고 있었기 때문이다.

 

#4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main
 
import (
    "fmt"
    "time"
)
 
func main() {
    go timeCount("number1")
    go timeCount("number2")
}
 
func timeCount(name string) {
    for i := 0; i < 10; i++ {
        fmt.Println(name, ":", i)
        time.Sleep(time.Second)
    }
}
 

 

결과

 

main 함수에서 고루틴 두개와 5초간 sleep으로 설정해두면 고루틴도 5초간 살아있고

0, 1, 2, 3이 살아있는 것을 볼 수 있다. 

 

 

이 포스팅은 다음 강의를 보고 작성하였다. 

 

https://academy.nomadcoders.co/courses/769984/lectures/13962838

 

#3.2 Goroutines

Write fast and beautiful code

academy.nomadcoders.co