동기, 비동기, 블록, 논블록
- 2 mins비동기 프로그래밍
비동기 프로그래밍을 할 때에는 다음과 같은 네 가지 핵심 키워드가 있다.
동기, 비동기, 블록, 논블록
지긋지긋한 용어싸움이 또 시작됐다.
사실 블록, 논블록은 이름부터 직관적이라서 이해하기가 어렵지 않다.
- 블록: 어떤 일을 요청하고, 작업이 끝날때까지 다른 일을 할 수 없다.
- 논블록: 어떤 일을 요청하고, 작업이 끝날때까지 다른 일을 할 수 있다.
깔끔하지 않은가?
하지만 동기/비동기의 개념과 섞이게 되면 뭔가 명쾌하지 않고 아리송해지는 상황이 많다.
똑같은 상황이라도 어떤 관점에서 보느냐에 따라 동기상태일수도, 비동기상태일수도 있다.
그래서 동기/비동기/블록/논블록 각각의 개념을 딱딱하게 이해하기 보다는,
실제 상황에서 어떤식으로 적용되는지를 통해 그 ‘느낌’을 이해하는 것이 좋다.
우리가 좋아하는 치킨으로 예를 들어보자.
퇴근길에 치킨이 땡겨서 집앞에 있는 치킨집에 들렀다.
몇 가지 상황극(?)으로 동기와 비동기, 블록과 논블록을 이해해보자.
상황1. 치킨을 시키고 가게에서 기다린다.
이는 동기 상태로, 내 관심은 오로지 “치킨이 완성되었느냐?”에만 집중되어있다.
이 때,
- 치킨이 튀겨질때까지 그저 하염없기 기다린다.
- 동기/블록
- 치킨이 완성되면 주인이 알려준다
- 치킨이 튀겨질때까지 주인에게 완성됐는지 계속 물어본다.
- 동기/논블록
- 하지만 치킨이 완성되어도 주인이 알려주지 않고, 직접 물어봐야 알려준다
- 개념적으로 설명은 했지만 사실 사용할 일이 별로 없다. 딱봐도 비효율적이지 않은가?
- 동기라는 개념이 애초에 ‘관심이 오로지 해당 작업에 집중되어있는 상태’이기 때문에 논블록이 크게 의미가 없다.
상황2. 치킨을 시키고 일단 집으로 간다.
이는 비동기 상태로, 물론 치킨을 기다리지만 그 때까지 다른 일을 할 수 있다.
- 일단 집안일을 좀 하다가 전화로 치킨이 완성됐는지 물어본 후, 완성될 때까지 기다린다.
- 비동기/블록
- 치킨이 완성됐는지 물어보는 순간은 볼록되지만, 나머지는 자신의 일을 할 수 있다.
- 소켓 통신에서 connection을 맺고 select를 통해 기다리는 과정을 생각해보면 된다.
- 집안일을 하고있으면 치킨집에서 완성됐다고 알려준다.
- 비동기/논블록
- 위와 거의 똑같은 상황이지만, 직접 물어보기 위해 블록되는 시간이 없어서 더 효율적이다.
크게 네 가지 사례로 동기, 비동기, 블록, 논블록을 이해해봤다.
딱보면 비동기/논블록이 항상 효율적일 것 처럼 보이는데, 과연 그럴까?
‘치킨주문’과 ‘집안일’을 처리해야하는 상황에서는 비동기/논블록 방식이 확실히 효율적으로 보인다.
하지만 ‘커피주문’과 ‘집안일’을 처리해야하는 상황에서도 과연 그럴까?
카페에서 아메리카노를 시키고, 집에서 다른 일을 하다가 전화가 오면 받으러 간다?
집에 도착하기도 전에 커피가 완성되어서 다시 돌아가야 할 수도 있다.
오히려 왔다갔다하면서 소모하는 에너지가 더 크고,
그냥 기다렸다가 받는 것 보다 많은 시간이 걸릴수도 있다.
이처럼 빠르게 처리되는 특정 작업에 대해서는,
동기/블록 방식으로 처리한 후에 다음 작업을 처리하는것이 더 효율적일 수 있다.
즉, 어떤 것이 반드시 좋은게 아니라, 상황에 따라 동기/비동기 방식을 적절히 활용해야한다.