본문 바로가기

Developer/Go

(4)
Golang 고루틴(goroutine) 라이프사이클 관리 - channel 개요 (Overview) Golang 고루틴(goroutine) 라이프사이클 관리 - context.Context 개요 (Overview) Golang에서는 고루틴이라는 비동기 작업을 생성할 수 있고 쓰레드와 비교해 가볍기 때문에 동시에 수백 개를 만들어도 메모리를 많이 사용하지 않는다. 다만 특성상 비동기로 실행 torrang.tistory.com Golang에서 실행 중인 고루틴의 흐름을 제어할 수 있는 방법은 컨텍스트(Context) 외에도 채널(Channel)을 사용하여 흐름 제어를 할 수 있다. 채널은 다른 언어에서 일반적으로 큐(Queue)와 동일한 역할을 하고 있지만 Golang에서의 채널은 큐 외에도 흐름 제어의 역할도 가능하다. 채널은 기본적으로 별도의 동기 작업 없이도 안전하기 때문에 ..
Golang 고루틴(goroutine) 라이프사이클 관리 - context.Context 개요 (Overview) Golang에서는 고루틴이라는 비동기 작업을 생성할 수 있고 쓰레드와 비교해 가볍기 때문에 동시에 수백 개를 만들어도 메모리를 많이 사용하지 않는다. 다만 고루틴은 비동기로 실행되고 쓰레드와 다르게 종료할 수 있는 함수를 제공하지 않는다. 즉 고루틴을 생성한 함수가 종료되더라도 생성된 고루틴은 남아서 계속 실행된다. 따라서 별도의 시그널을 통해서 종료해줘야 한다. 잠깐 실행되는 애플리케이션이면 큰 문제가 없지만 서버 애플리케이션과 같이 한번 실행하면 짧게는 며칠 길게는 몇 달을 넘게 계속 돌린다. 이때 생성한 고루틴을 제때 정리해주지 않으면 실행하는 고루틴이 계속 쌓여서 Memory Leak이 발생하게 되고 아무리 가벼운 고루틴이더라도 계속 쌓이면 결국 OOM(Out of Mem..
컨테이너 환경에서 GOMAXPROCS 이슈 GopherCon Korea 2023 발표 중 당근에서 컨테이너 환경에서 발생했던 이슈에 대한 내용이 흥미로워 확인을 해봤다. 회사에서도 Go 프로그램이 컨테이너 환경에서 실행되고 있어 공부해 둘 필요가 있을 것 같다. GopherCon Korea 2023 - 당근 발표 Issue runtime: make `GOMAXPROCS` cfs-aware on `GOOS=linux` · Issue #33803 · golang/go Problem The default setting of runtime.GOMAXPROCS() (to be the number of os-apparent processors) can be greatly misaligned with container cpu quota (e.g. as imp..
Golang defer 실행 순서 Go를 사용 중 문득 든 궁금증이 defer 함수를 여러 개 사용한다면 실행 순서가 어떻게 되는지 궁금했다. 기본적으로는 호출한 순서대로 실행될 것 같았고 고루틴의 경우는 예외적으로 랜덤하게 실행될 것으로 생각되어 실험을 해보았다. 테스트 기본 사용 시 package main import ( "log" "time" ) // 3초 후 숫자 프린트 // 결과: 3, 2, 1 func printNo() { defer log.Println("printNo=1") defer log.Println("printNo=2") defer log.Println("printNo=3") log.Println("run defer functions after 3 seconds") time.Sleep(time.Duration(3) ..