DevOps/GoLang

[Golang] Goroutine (고루틴)

WhiteDuck 2023. 9. 3. 13:12

- 본 글은 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




참고


반응형

'DevOps > GoLang' 카테고리의 다른 글

[Golang] Channel  (0) 2023.09.03