개발바닥

고루틴(goroutine) 본문

GO 언어

고루틴(goroutine)

라이언 2022. 2. 21. 22:13
반응형

고루틴이란?

고루틴은 GO언어에서 프로그램의 동시성을 쉽게 구현하고 기존의 단순 스레드 기반의 구현에 비해 효율적인 동작을 수행해 내기 위해 만든 작업단위 이다.

기본적으로 메인함수를 실행하게 되면 메인 고루틴이 실행되게 된다. 메인 고루틴이 종료하게 되면 즉시 다른 고루틴들이 종료된다.

(멀티 스레드를 활용할 때는 항상 예상 가능 하도록 코드를 구현해야된다.)

즉, Go 언어로 동시에 실행되는 모든 활동을 고루틴이라고 한다.

 

여기서 주의할 점

CPU의 스레드와 OS 영역에서 다뤄지는 스레드는 서로 지칭하는 대상이 다르다.
CPU의 스레드는 한개의 코어를 OS에게 여러개로 인식시켜 동작하도록 하는 하드웨어 영역의 개념이고,
고루틴에서 사용하는 스레드는 OS 영역에서 다뤄지는 스레드로 OS 하위의 소프트웨어 영역에서 CPU의 작업단위로 지칭되는 용어이다.

 

고루틴 관리

고루틴은 런타임 스케쥴러에 의해 관리된다. (Go 프로그램이 실행되는 시점에 함께 실행된다.)

 

런타임 스케쥴러는 다음과 같은 원칙을 가지고 동작한다.

- 커널 스레드는 비싸기 때문에 되도록 작은 수를 사용

- 많은 수의 고루틴을 실행하여 높은 동시성를 유지한다.

- N 코어 머신에서, N 개의 고루틴을 병렬하게 동작시킨다.

 

주의할 점

동시성과 병렬성은 서로 비슷한 개념이라고 생각할 수 있지만 명확히 다른 개념이다.
동시성은 싱글 코어에서 멀티 스레드를 동작시키는 논리적인 개념으로 한번에 여러개가 동시에 실행되는 것 처럼 보이게 된다.
병렬성은 물리적으로 동시에 여러작업을 처리할 수 있기 때문에 멀티 코어에서 멀티 스레드를 동작시키는 방식이다.

(Go 1.5 버전 이전에는 CPU 코어 하나만 사용하도록 기본 설정되어 있었다. 하지만 현재는 물리 CPU 개수만큼 사용하도록 설정되어 각 코어에서 시분할처리로 동작한다. 만약에 여러 CPU를 병렬로 실행하고자 하는 코드를 작성하고자 한다면 runtime.GOMAXPROCS(runtime.NumCPU()) 함수를 호출하여 시스템의 모든 코어를 사용하도록 설정할 수 있습니다.)

 

고루틴은 스레드에 비해 더 작은 메모리를 필요로 한다. (고루틴 2KB, 스레드 1MB)

스레드는 OS에 리소스(메모리)를 요청하고 다 사용하면 반환해야 하기 때문에 상당한 생성, 소멸 비용이 들어간다.

반면에 Go 런타임 스케줄러에 의해 생성 및 소멸된다.

 

언제 고루틴을 사용하면 좋을까?

고루틴을 사용하게 되면 병렬로 동시에 처리하기 때문에 로직끼리 서로 의존도가 존재하지 않을 때 사용하는 것이 바람직하다.

예를들어서 어떤 api를 호출했을 때 2개에 테이블에 데이터를 저장할 때 서로 연관이 없다면 고루틴을 사용하는 것이 응답시간을 조금이라도 줄일 수 있을 것이다. 여러 개에 데이터를 테이블에 넣어야 될 때 고루틴을 사용할 수 있을 것이다.

 

 

반응형

'GO 언어' 카테고리의 다른 글

인터페이스 (interface)  (0) 2022.03.06
모듈(Module)  (0) 2022.03.06
구조체(Struct)  (2) 2022.02.28
슬라이스(Slice)  (0) 2022.02.26
채널(Channel)  (0) 2022.02.22
Comments