1. Go루틴
- Go루틴(goroutine)은 Go 런타임이 관리하는 Lightweight 논리적 (혹은 가상적) 쓰레드이다.
- Go에서 "go" 키워드를 사용하여 함수를 호출하면, 런타임시 새로운 goroutine을 실행한다.
- goroutine은 비동기적으로 함수루틴을 실행한다. 이를 통해 여러 코드를 동시에 실행한다.
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 10; i++ {
fmt.Println(s, "***", i)
}
}
func main() {
// 함수를 동기적으로 실행
say("첫 번째 함수 실행")
// 함수를 비동기적으로 실행
go say("두 번째?")
go say("세 번째?")
go say("네 번째?")
// 3초 대기
time.Sleep(time.Second * 3)
}
- say() 함수를 동기적으로 호출하고, 다음으로 go키워드를 붙여서 say() 함수를 3번 호출
- 첫 번째 say() 함수 실행 후, 다음 3개의 go say() 함수가 실행.
- 3개의 go say() 함수가 실행되면서 time.Sleep을 실행한다.
- goroutine들은 실행순서가 일정하지 않으므로 실행 시 마다 다른 출력 결과를 나타낼 수 있다.
2. 다중 CPU 처리
- Go는 기본적으로 1개의 CPU를 사용한다.
- 여러 개의 Go 루틴을 만들더라도, 1개의 CPU에서 작업을 시분할하여 처리한다 (Concurrent 처리).
- 만약 머신이 복수개의 CPU를 가진 경우, Go 프로그램을 다중 CPU에서 병렬처리 (Parallel 처리)하게 할 수 있는데, 병렬처리를 위해서는 아래와 같이 runtime.GOMAXPROCS(CPU수) 함수를 호출하여야 한다.(여기서 CPU 수는 Logical CPU 수를 가리킨다.)
package main
import (
"runtime"
)
func main() {
// 4개의 CPU 사용
runtime.GOMAXPROCS(4)
//...
}
3. Concurrency vs Parallelism
https://umi0410.github.io/blog/golang/go-concurrency-vs-parallelism/
- 이 블로그를 참조했다.
- 예를 들어 사회적 거리 두기로 인해 우리 Gopher(고퍼)가 친구들과 떠나려는 예약했던 여행이 취소되었고, 항공권, 호텔, 렌트카 예약을 모두 취소해야하는 상황
(1)동시성(Concurrent)의 예시 - 만약 모든 취소 작업이 고객센터 1대1 채팅으로 이루어지는 경우. Gopher1 혼자 모든 취소 작업을 동시적으로 수행 가능
> Gopher1 혼자 항공권 취소 신청, 호텔, 렌트카의 고객센터 1대1 채팅에 예약 취소 신청을 함
> 상담사분이 답장을 주는 대로 작업을 진행
> Gopher1 혼자서 세 개의 취소 작업을 동시에 진행하는 셈이다.
(2) 병렬성(Parallelism)의 예시 - 만약 모든 취소 작업이 고객센터 전화 상담으로 이루어 지는 경우. Gopher1 혼자 모든 취소 작업을 동시에 진행할 수는 없고, Gopher 1, 2, 3이 병렬적으로 진행할 순 있음.
- 나는 개발하면서 다중 CPU처리는 해보지 못했다.
- 고 루틴도 한 번 사용해봤으며 사용하면서 에러를 마니 겪었던 기억이 있다.
- 이론 공부를 해보고 토이 프로젝트라도 진행해보면서 다시 복습을 해봐야겠다.
- 자바 공부와 병행하느라 너무 힘들다 ㅠㅠ 요새 느끼는건 너무 욕심을 부리느라 다 놓치는게 아닐까 싶다...
'개발 > Go' 카테고리의 다른 글
[Fiber] Go로 Backend 시작하기 (2) | 2022.08.10 |
---|---|
[Go] 기초 - 채널 (0) | 2022.08.04 |
[Go] 기초 - defer&panic (0) | 2022.08.01 |
[Go] 기초 - Error (0) | 2022.07.31 |
[Go] 기초 - 인터페이스 (0) | 2022.07.30 |