인프런 커뮤니티 질문&답변
Receive 비동기 관련 질문
작성
·
220
1
1. 흐름을 따라가고 있는데, Receive를 구현하는 부분에서 이해가 안가는 부분이 있습니다.
왜 Receive 부분을 비동기 방식으로 구현해야 하나요? 그냥 순차적으로 함수안에 넣어서 똑같이 실행해도 문제가 없어보이거든요.
이전 강의에서 다룬 Accept 부분은 이해가 가는데, 나머지는 그대로 순차적으로 가도 문제가 없어보이는데 어떤 이유에서 비동기 방식으로 구현해야하는지 궁금합니다.
2. 그리고 강의 후반쯤에 클라를 종료했을때, 위의 사진처럼 ConnectionReset 라는 문구가 나오시던데 제 컴퓨터에서는 아무 반응 없는 이유가 뭔지 알 수 있을까요? ConnectionReset을 호출하는 부분이 어디인지 궁금합니다 :)
답변 1
3
1.
동기/비동기 함수와 관련된 문제는 게임에서 매우 매우 중요한 개념입니다.
동기 방식의 함수는 일단 한 번 호출하면 결과가 확정되기 전까지는 실행 흐름을 멈추고 대기를 하게 됩니다.
쉽게 이해하기 위해 식당에서 직원이 '아무' 손님한테 가서 주문을 받는다고 생각해보세요.
사실 그 손님이 정말 주문을 하고 싶었는지 아닌지조차 모르고 무턱대고 갔으니,
최악의 경우 그 손님이 술에 취해 잠들었다면,
그 직원은 아무 일도 하지 못하고 3시간 동안 대기를 하게 될겁니다.
반면 비동기 함수는 일단 결과를 반환하기 때문에
그 결과 값에 따라 다른 처리를 할 수 있게 됩니다.
위의 식당 예로 들면 직원이 손님한테 '주문하실 것이 있을까요?'라고 물어보고
Yes인 경우 주문을 받고, No인 경우 그냥 다른 일을 하러 가는 셈이 되겠죠.
아니면 손님한테 필요한게 있으면 벨을 누르라고 (콜백) 방식으로 처리하던가요.
만약에 동접 1만명을 받는 서버에서 모든 유저들의 네트워크 요청을 대기를 타는 동기 방식으로 처리하면,
최악의 경우 대기를 타는 쓰레드가 1만개가 생길 수 있다는 얘기가 됩니다.
(대기중인 직원을 1만명 고용하는 식당이라니... 인건비가 후덜덜하겠죠)
동기/비동기에 대한 부분은 딱히 네트워크 통신에만 등장하는게 아니고,
입출력 (ex. 키보드 입력)에는 대부분 들어가는 문제입니다.
키보드 입력을 받아 처리하고 싶더라도, 아무 입력이 없으면 그냥 그대로 게임을 진행시켜야겠죠.
따라서 키보드 입력도 게임에선 비동기 함수를 이용해 체크를 해야 한다는 의미가 됩니다.
2.
한쪽이 소켓 연결이 끊겼는데 메시지를 보내려 할 때 Exception이 일어나는데,
거기서 Exception 이유를 Write하게 해서 출력해서 저 문구가 출력 되었을겁니다.
참고로 실행 환경에 따라 차이가 있을 수 있습니다. (미세하게 클라를 먼저 껐다거나...)





