예전에 한 면접에서 면접관이 고루틴에 대해 물어봤다.
그 당시에 코인 자동 매매 시스템을 구축하던때라 모든 시스템을 고루틴으로 짯었지만 나는 내가 쓰고 있던 기능이 고루틴이라는 용어라는 걸 알지 못해서 그게 뭔지 모른다고 답변했다.
집에와서 고루틴을 좀 알아봤더니 내가 구축했던 시스템에 고루틴이 안들어가는게 없었다.
왜냐면 메인에서 20개의 고루틴을 돌면서 내코드는 시작했기 때문에..
당연히 내 깃허브에 올라간 그 코드를 봤는지 안봤는지는 둘째치고 면접관의 입장에서 난 아무것도 모르는 사람이었다.
그리고 그 당시에는 난 용어만 몰랐지 다 안다고 생각했다. (어리석은 녀석)
하지만 용어를 모르는데 어떻게 그 기능을 안다고 할수 있을까.
그때부터 의사소통에 관해 생각해보게 됐고 기본이 안되어있다고 느껴서 많이 부족하구나 했다.
고루틴하면 따라오는 수식어가 병렬성 , 병행성 , 채널 등등 많은게 따라온다.
고 언어를 처음 시작할때 ( 사실 고 언어가 제대로 시작한 첫 언어다 ) 병렬성, 병행성 이런 얘기를 하는게 너무 고리타분 했고 별로 신경 쓰지도 않았는데 현업에서 사용할 일이 생기니 괜히 용어가 있는게 아니고 괜히 다른게 아니다.
고루틴은 가벼운 스레드와 같은것으로 물리적으로 나뉘어진게 아닌 논리적으로 나뉘어진 흐름이다. ( 책에 쓰여진 그대로 적어봤다.)
쉽게 말해 고루틴이란 같이 실행되는것 처럼 보이지만 아주 별개의 작업을 하는 것이다.
같이 하는 작업의 예시 ( 물리적으로 별개의 흐름 : 병렬성 )
사람 두명이 고객센터에서 일하는데 전화선이 두개라 동시에 두명의 고객을 응대하는 것
같이 하는 작업 같지만 다른 작업의 예시 ( 논리적으로 별개의 흐름 : 병행성)
귤을 먹으면서 핸드폰을 하는것
사람이 두명이라는 건 컴퓨터로 말하면 CPU (코어) 가 2개가 있다는 것이고
귤을 먹으면서 핸드폰을 하는건 코어가 1개인데 그걸 잘게 나눠서 쓴다는 거다.
고루틴은 아주 경량으로 코어를 나누는 걸 지원한다고 보면 되고 여러가지 일을 동시에 ( 논리적으로 ) 하는 걸 가능하게 해준다.
이게 고의 강점이자 고랭을 쓰는 이유라고 하는데 솔직히 다른언어를 깊게 들어가보지 않아서 나는 모르겠다.
하지만 고루틴으로 비동기 프로그래밍을 쉽게 짤수있다는건 명확한 사실이다.
예시를 보자.
func main() {
fmt.Println("그냥 말 1")
go func(){
time.Sleep(time.Second)
fmt.Println("첫번째 고루틴")
}()
go func(){
time.Sleep(time.Second)
fmt.Println("두번째 고루틴")
}()
fmt.Println("그냥 말 2")
우리는 위에서 아래로 프로그램이 차례대로 읽는다는것 정도는 안다.
고루틴은 go 함수 이런식으로 선언을 할 수 있다.
하지만 고루틴이 들어가게 되면 위 그냥 말 1 과 그냥 말 2 는 차례대로 실행되지만 고루틴은 우리가 생각하는 거랑은 다르게
논리적으로만 나뉘어져 실행된다 , 자 여기서 결과는 어떻게 될까?
time.Sleep(time.Second)는 1초를 멈추라는 말이다.
아무리 똑똑하다 한들 처음 보고 이정답을 맞추는 사람은 거의 없다. 우리 뇌는 차례대로에 익숙해져 있으니
결론부터 말하면 고루틴은 실행되지 않는다.
왤까? main 함수는 하나의 물리적인 실행이다.
고로 main은 go 루틴이 실행되는걸 기다려주지 않는다.
그냥 말 1과 그냥 말 2를 로그에 찍고 더이상 할일이 없다고 판단해 프로그램은 종료하게 된다.
이정도만 이해해도 고루틴에 대해 기초는 잡았다고 보면된다.
공유 메모리를 같이 쓰려면 WaitGroup을 써야 한다느니 ,
안쓰면 데드락에 걸린다느니 ,
최후의 만찬 이미지를 가져와서 포크랑 나이프를 동시에 집는다느니,
이런 개념은 개발을 해보고 난후 더 뚜두러 맞으면서 왜 문제가 되는지 인지를 한 후에 알아야 정확하게 공부를 하게 된다고
생각해서 굳이 얘기하지 않고 기회가 되면 조금 더 들어가 보겠다.
'Go' 카테고리의 다른 글
golang Gracefully Shutdown (위대한 쇼다운맨 ) (0) | 2022.05.03 |
---|---|
Golang TDD (테스트 주도 개발) 유닛테스트 루트 절대경로 설정 (0) | 2022.04.08 |
고(golang) 메일보내기(google) (0) | 2022.01.13 |
고(golang) Context 겉핥기#3 (0) | 2022.01.10 |
고(golang) 비동기 큐 구현 (0) | 2021.11.29 |