Go Routine 이란?
Go Routine - [ Concurrency vs Parallelism ]
Go Routine은 동시성과 병렬성을 매우 간결하고 효과적으로 다룰 수 있는 기능을 제공합니다.
동시성(Concurrency)
- 싱글 코어에서 멀티 쓰레드 동작
- 여러 작업을 시간을 나누어 사용함으로써 동시에 실행되는 것처럼 보이는 기술입니다.
- 실제로는 한 순간에 하나의 작업만 처리하지만, 작업들 사이를 빠르게 전환하면서 동시에 진행되는 것처럼 보이게 합니다.
- 단일 코어 환경에서 효율적인 자원사용과 빠른 응답 시간을 목표로 사용됩니다.
병렬성(Parallelism)
- 멀티 코어에서 멀티 쓰레드 동작
- 여러 작업을 실제로 동시에 실행하는 기술입니다.
- 멀티코어 프로세서를 사용하며, 각 코어에서 별도의 작업을 동시에 수행합니다.
- 멀티코어 환경에서 성능을 극대화하기 위해 사용됩니다.
다중 CPU 처리
runtime.GOMAXPROCS()
함수는 프로그램이 동시에 실행할 수 있는 최대 CPU 코어 수를 설정합니다. Go 1.5 버전부터,runtime.GOMAXPROCS()
의 디폴트 값은 시스템에서 사용 가능한 물리적 CPU 코어의 수로 설정되어 있습니다.
예시 (Basic)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import (
"fmt"
"time"
)
func printHelloWorld(strIn string) {
for i := 0; i < 10; i++ {
fmt.Println(strIn, "hello world", i)
}
}
func main() {
// 기존 -> 동기적
printHelloWorld("Sync")
// Go Routine -> 비동기적
go printHelloWorld("Async1")
go printHelloWorld("Async2")
go printHelloWorld("Async3")
time.Sleep(time.Second * 3)
}
예시 (anonymous function)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import (
"fmt"
"sync"
)
func main() {
// WaitGroup 생성. 2개의 Go Routine이 끝날때까지 기다리기
var wait sync.WaitGroup
wait.Add(2)
go func() {
defer wait.Done()
fmt.Println("Hello")
}()
go func(msg string) {
defer wait.Done()
fmt.Prinln(msg)
}("Hi")
wait.Wait() //Go루틴이 모두 끝날 때까지 대기
}
궁금하신 점이나 추가해야할 부분은 댓글이나 아래의 링크를 통해 문의해주세요.
Written with KKam._.Ji
This post is licensed under CC BY 4.0 by the author.