목록전체 글 (64)
고루틴은 한 번 시작하면 외부에서 직접 멈출 방법이 없다. 채널로 quit 신호를 보내는 방법이 있지만, 고루틴이 다른 고루틴을 생성하는 계층 구조에서 quit을 일일이 전달하는게 너무 복잡해진다. context는 취소 신호를 트리 구조로 자동 전파하기 때문에 복잡한 계층 구조에서 효과적으로 고루틴을 정지시킬 수 있다.위의 그림처럼 고루틴이 부모 자식 관계로 트리 구조를 형성해 있을 때, 문제가 발생하면 context를 통해 취소 신호가 전파된다. 이를 실제로 구현하면 아래의 코드와 같다.HTTP Handler에서 파생되는 queryDB 함수와 queryCache 함수, callAPI() 함수의 파라미터로 컨텍스트를 전달하여 취소 신호가 전파될 수 있도록 한다. context에는 자주 사용되는 4가지 생..
Go의 동시성이 OS 스레드 기반의 다른 프로그래밍 언어들보다 훨씬 가벼운 이유는 런타임이 자체 스케줄러를 갖고 있기 때문이다.OS 스레드를 Go가 직접 사용하는게 아니라, G(goroutine) -> P(processor) -> M(Machine-OS Thread)의 3계층 구조로 고루틴을 관리한다.고루틴은 Go의 경량 실행 단위(Thread)로 go 키워드를 통해 사용할 수 있다. OS 스레드가 환경에 따라 1~8MB의 스택 크기를 갖는 반면, 고루틴은 그에 비해 최대 500배 작은 2KB의 초기 스택을 갖는다. 항상 2KB로 고정되어 있는건 아니고 64bit 환경 기준 필요에 따라 최대 1GB까지 확장이 가능하다. 또 OS 스레드가 일반적으로 컨텍스트 스위치에 ~1μs가 걸리는 반면 고루틴은 일반적..
Go에서 메모리는 크게 두 곳에 할당된다. 스택은 함수가 호출될 때 자동으로 생성되고 반환 시 즉시 사라지는 임시 공간으로 사용되고, 힙은 장기적으로 보관되어야 하는 데이터가 머무는 공간으로 사용된다. 장기적인 보관이라 함은, "변수가 함수의 범위를 벗어나도 살아남아야 한다." 정도로 생각하면 쉽게 이해할 수 있다. 함수의 범위에서 벗어나 힙에 할당되는 것을 escape 라고 부른다. 스택 메모리는 자동으로 해제되고 속도가 빠르며, 크기 제한이 존재한다. 주로 함수 내부에 정의된 지역 변수, 함수 파라미터가 스택 메모리에 저장된다. 힙 메모리는 GC를 통해 관리되어 속도가 느리지만, 크기가 스택 메모리에 비해 유연하다. 주로 포인터 타입으로 반환된 변수, 클로저 캡처 등이 저장된다.Go는 선언된 변수가 ..