개요go의 context 기능은 go 커뮤니티에서도 논쟁이 많고 이야기가 여러 가지가 있습니다.정리하면 주로 아래와 같죠 작업 취소와 타임 아웃의 유용성 : 고루틴 작업에서의 취소와 타임아웃에서는 리소스 누수 방지와 응답 개선의 효과가 있음사용에 대한 어려움 : 초기 학습의 혼란과 올바른 패턴에 이해 필요매개변수 남용 우려 : context로 값을 전달하는 과정이 오히려 가독성을 해칠 수 있다로깅과 통합 : 고유 값을 context에 담아서 로깅에 사용, 매개변수 남용이 될 수 있음동시성에서 필요하고 쓰기는 좋은 건 맞지만, 올바른 패턴의 필요성을 강조하고 있습니다.남발하면 가독성을 그만큼 해쳐지기 때문이죠 저 같으 경우 아직 Context의 존재와 기능은 머리로는 알고 있습니다만회사 소스 중에 어디에 ..
동시성

주의반복문에서 고루틴을 돌리면 신기하게 결과물이 나올 때가 있습니다.아래 코드를 실행했을 때의 결과는 무엇일까요?import ( "fmt" "sync")func main() { var wg sync.WaitGroup for _, text := range []string{"a", "b", "c"} { wg.Add(1) go func() { defer wg.Done() fmt.Println(text) }() } wg.Wait()} 만약 a, b, c가 랜덤으로 출력 것이라 생각하신다면 틀렸습니다결과는 아래와 같습니다.ccc 왜 이런 일이이유는 루프문이 고루틴보다 먼저 끝나서 고루틴에서 사용할 수 있도록 메모리를 힙으로 옮겼기 때문입니다.즉 for문이 먼저 끝나서 text의 값은 마지막 c를 가리..

Go 스케줄링고루틴 : Go의 최소 실행 단위로, main도 profile도 모든 게 다 고루틴고의 동시성에서는 Go 스케줄러로 어떻게 효율적으로 관리하느냐에 크게 의존합니다. goroutine 생성새로운 작업(Goroutine, G)이 생성되면, 해당 작업은 현재 P(processor)의 LRQ에 삽입됩니다.P는 자신만의 LRQ(Local Run Queue)를 보유하며 P의 개수는 GOMAXPROCS로 결정됩니다.이거로 동시 실행이 가능한 goroutine 수를 제한합니다.로컬 처리P는 자신의 LRQ에 있는 작업을 우선 실행하는 데 이 과정은 빠르고 효율적이며, 락 경합 없이 처리됩니다.글로벌 작업 분배만약 한 P의 LRQ가 비거나 작업이 부족하면, 해당 P는 다른 P의 LRQ에서 작업을 훔치거나 G..

개요이번 포스팅은 Golang을 할 때 가장 큰 장점으로 꼽히는 부분인 동시성(고루틴)과 크게 관련된 내용입니다.동시성 프로그래밍은 사실 쉽지 않습니다. 동시에 실행된다는 개념 때문에 프로그래머가 생각하는 순서와 실제 프로세스의 순서가 다를 수 있습니다.이 문제를 레이스 컨디션이라 부릅니다.레이스 컨디션 (Race Condition) : 개발자의 의도와 상관없이 프로세스의 순서가 바뀌어 결과가 일정하지 않은 문제 아래는 간단한 레이스 컨디션의 예제입니다.var num intgo func() { num++}()if num == 0 { fmt.Printf("The value is %d.\n", num)} 위 코드의 결과는 대부분 "The value is 0."로 출력될 겁니다.요즘 사용하는 컴퓨터의 수준은..

최근 면접에서 Go의 Context가 뭐냐고 물으셨다.가장 중요할 때 기억이 나지 않는 게 세상의 규칙인 건가.. 라는 생각이 들었다 그렇게 백수의 기간이 늘었다 Context 정의context 패키지에서 제공하는 걸로 간단하게 생각하면 작업 명세서라 할 수 있다."10시부터 12시는 네가 일해, 그리고 중간에 냉장고 정리를 하고 에어컨을 꺼야 돼, 나는 여기서 청소하고 있을게"와 어떻게 하지를 정의해주는 작업 명세서다. 새로운 고루틴을 시작할 때 시간을 지정해주기도 하고 외부의 작업을 취소할 때도 사용할 수 있다.거기에 작업 설정에 대한 정보도 전달이 가능하다. 이게 가능해진 버전은 Go 1.7 버전(2016-08-15일)부터로 그때부터 기본으로 탑재가 됐다.Context 단어 뜻을 그대로 직역하면 ..