동기, 비동기, 블록, 논블록

- 2 mins

비동기 프로그래밍

비동기 프로그래밍을 할 때에는 다음과 같은 네 가지 핵심 키워드가 있다.

동기, 비동기, 블록, 논블록

지긋지긋한 용어싸움이 또 시작됐다.


사실 블록, 논블록은 이름부터 직관적이라서 이해하기가 어렵지 않다.

깔끔하지 않은가?


하지만 동기/비동기의 개념과 섞이게 되면 뭔가 명쾌하지 않고 아리송해지는 상황이 많다.

똑같은 상황이라도 어떤 관점에서 보느냐에 따라 동기상태일수도, 비동기상태일수도 있다.

그래서 동기/비동기/블록/논블록 각각의 개념을 딱딱하게 이해하기 보다는,

실제 상황에서 어떤식으로 적용되는지를 통해 그 ‘느낌’을 이해하는 것이 좋다.


우리가 좋아하는 치킨으로 예를 들어보자.

퇴근길에 치킨이 땡겨서 집앞에 있는 치킨집에 들렀다.

몇 가지 상황극(?)으로 동기와 비동기, 블록과 논블록을 이해해보자.

상황1. 치킨을 시키고 가게에서 기다린다.

이는 동기 상태로, 내 관심은 오로지 “치킨이 완성되었느냐?”에만 집중되어있다.

이 때,

  1. 치킨이 튀겨질때까지 그저 하염없기 기다린다.
    • 동기/블록
    • 치킨이 완성되면 주인이 알려준다
  2. 치킨이 튀겨질때까지 주인에게 완성됐는지 계속 물어본다.
    • 동기/논블록
    • 하지만 치킨이 완성되어도 주인이 알려주지 않고, 직접 물어봐야 알려준다
    • 개념적으로 설명은 했지만 사실 사용할 일이 별로 없다. 딱봐도 비효율적이지 않은가?
    • 동기라는 개념이 애초에 ‘관심이 오로지 해당 작업에 집중되어있는 상태’이기 때문에 논블록이 크게 의미가 없다.

상황2. 치킨을 시키고 일단 집으로 간다.

이는 비동기 상태로, 물론 치킨을 기다리지만 그 때까지 다른 일을 할 수 있다.

  1. 일단 집안일을 좀 하다가 전화로 치킨이 완성됐는지 물어본 후, 완성될 때까지 기다린다.
    • 비동기/블록
    • 치킨이 완성됐는지 물어보는 순간은 볼록되지만, 나머지는 자신의 일을 할 수 있다.
    • 소켓 통신에서 connection을 맺고 select를 통해 기다리는 과정을 생각해보면 된다.
  2. 집안일을 하고있으면 치킨집에서 완성됐다고 알려준다.
    • 비동기/논블록
    • 위와 거의 똑같은 상황이지만, 직접 물어보기 위해 블록되는 시간이 없어서 더 효율적이다.


크게 네 가지 사례로 동기, 비동기, 블록, 논블록을 이해해봤다.

딱보면 비동기/논블록이 항상 효율적일 것 처럼 보이는데, 과연 그럴까?

‘치킨주문’과 ‘집안일’을 처리해야하는 상황에서는 비동기/논블록 방식이 확실히 효율적으로 보인다.

하지만 ‘커피주문’과 ‘집안일’을 처리해야하는 상황에서도 과연 그럴까?

카페에서 아메리카노를 시키고, 집에서 다른 일을 하다가 전화가 오면 받으러 간다?

집에 도착하기도 전에 커피가 완성되어서 다시 돌아가야 할 수도 있다.

오히려 왔다갔다하면서 소모하는 에너지가 더 크고,

그냥 기다렸다가 받는 것 보다 많은 시간이 걸릴수도 있다.

이처럼 빠르게 처리되는 특정 작업에 대해서는,

동기/블록 방식으로 처리한 후에 다음 작업을 처리하는것이 더 효율적일 수 있다.

즉, 어떤 것이 반드시 좋은게 아니라, 상황에 따라 동기/비동기 방식을 적절히 활용해야한다.




코딩장이

코딩장이

-장이: [접사] ‘그것과 관련된 기술을 가진 사람’의 뜻을 더하는 접미사.

rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora