이 예시 코드를 실제로 구동하면 해당 스레드는 소켓이 would block인 상태에서는 계속해서 루프를 돕니다. 게다가 이 루프는 CPU를 쉬지 못하는 바쁜 상태로 만듭니다. 즉, CPU 코어 하나가 100% 사용량을 차지합니다. 게임 클라이언트를 만들 때는 이것이 그다지 문제가 되지 않습니다. 어차피 CPU가 쉬지 않으며 게임 업데이트와 렌더링을 담당하는 메인 스레드가 있고, 그 메인 스레드에서 이 일도 같이 하면 되기 때문입니다. 하지만 서버는 그러한 렌더링 루프가 없기 때문에 특별히 할 일이 없는 한 서버의 CPU는 최대한 놀고 있는 상태여야 합니다. 다른 일을 할 수 있는 여유를 두기 위해서입니다.
List<Socket> sockets; void NonBlockSocketOperation() { while (true) { foreach(s in sockets) { // 논블록 수신 ➊ (result, data) = s.receive(); if (data. > 0) { print(data); } else if (result != EWOULDBLOCK) { // 소켓 오류 처리를 한다. } } // ➋ } }