- 본 글은 2023.09.03 에 포스트된 글입니다.
개요
프로그램 사용에 따라서 두 개 이상의 쓰레드를 사용 해야 하는 경우도 있습니다. Golang 에서는 고루틴을 통해서 다른 곳에서 쓰이는 쓰레드처럼 멀티작업을 수행할 수 있습니다.
Goroutine
- 고루틴은 Go 런타임에 의해 관리되는
경량 쓰레드
입니다. - 고루틴은
KB 범위의 메모리만 소비
하기에 경량 쓰레드라는 말이 어울리는 것 같습니다. - 하지만 고루틴은 실제 OS 쓰레드와는 다르며, OS 쓰레드에 대한 추상 계층이라고 가정할 수도 있습니다.
- 고루틴은 로컬 저장소가 없기 때문에
부팅 시간이 OS 쓰레드보다 빠릅니다.
- 간단하게
go
키워드를 붙혀서고루틴으로 함수를 실행
할 수 있는데, 다음은 say 함수를 Goroutine 으로 실행하는 방법을 보여줍니다.
world
hello
hello
world
hello
world
world
hello
world
hello
- 하지만 여느 쓰레드와 마찬가지로 메인 쓰레드가 끝나면 Goroutine 도 정상적으로 작업을 수행할 수 없습니다.
- Go 런타임이 고루틴의 실행이 완료될 때까지 기다리지 않기 때문입니다.
물론 wait groups 등을 통해서 명시적으로 기다릴 수도 있습니다.
- 실제로 고루틴을 선언한 뒤 실행할 것이 없다면 다음과 같이 실행하지 않는 것을 보여줍니다.
Goroutine Wait Groups
WaitGroups(sync.WaitGroup)
는 고루틴 집합이 작업을 마칠 때까지 기다릴 수 있습니다. WaitGroups
에서는 다음 세가지 키워드가 있습니다.
Add(int)
- int : 기다릴 고루틴(Goroutine) 의 개수Wait()
- 고루틴(Goroutine) 이 실행을 마칠 때까지 기다리도록 지시Done()
- 특정 고루틴(Goroutine) 이 실행을 완료했음을 Go 런타임(Go 메인쓰레드)에 알림
다음은 WaitGroups 을 1개 사용한 예를 보여줍니다.
world
world
world
world
world
참고
- Goroutines example : https://go.dev/tour/concurrency/1
반응형
'DevOps > GoLang' 카테고리의 다른 글
[Golang] Channel (0) | 2023.09.03 |
---|