정확히는 공부용 파이썬 채팅 서버를 하나 만들어놓고 각 비동기 기술들을 교대로 붙여가며 써봤다.


1. socketserver module tcpserver + forkingmixin

클라이언트가 접속해 올 때마다 새로운 프로세스를 띄워 처리한다.

한 프로세스 당 한 클라이언트를 상대하므로 적은 수의 클라이언트를 상대할 때는 퍼포먼스가 압도적일 것이다.

하지만 채팅 서버, 더 나아가서 웹서버는 자잘하지만 많은 수의 클라이언트를 상대하는 경우가 많으므로 비효율적이다.

개미 잡겠다고 도끼를 든 꼴이다.


2. socketserver module tcpserver + threadmixin

클라이언트가 접속해 올 때마다 새로운 스레드를 띄워 처리한다.

프로세스를 띄우는 forkingmixin에 비해 좀 더 다수의 클라이언트를 상대하기에 적합하나 여전히 비효율적이다.


3. socket module socket + select

비동기 socket들의 관리를 os에 맡겨 처리한다.

물론 전부 맡길 수는 없고 내가 얘네들 쓸건데 이중 어떤 거 쓸수 있는지 골라달라고 하면 골라주는 정도다.

select를 호출할 때마다 파일 디스크립터(여기서는 socket.fileno()에 해당) 정보들을 전부 넘겨줘야 하는 등

성능상, 사용상 제약이 심한 구닥다리 기술이다.


4. socket module socket + epoll

구닥다리 select를 발전시킨 모델들이 운영체제 별로 있는데 윈도우에서는 iocp이고 리눅스에서는 epoll이다.

select와 달리 한번만 정보를 os에 전달해주고 그 이후로는 변경점만 전달하면 된다.

select처럼 os-dependent 하면서 더 나아가 os-specific하기까지 하다.

그래도 본격적으로 쓸만한 방법이다.


5. socket module socket + asyncio

coroutine으로 event-driven concurrency를 구현한 비교적 최신 기술이다.

드디어 파이썬도 독자적으로 쓸만한 비동기 처리를 구현해냈다고 볼 수 있다.

동접수가 아주 적을 때는 특별히 성능상의 이득이 없지만 동접자수가 증가할 수록 빛을 발한다.

(스레드 기반 apache vs 이벤트 드리븐 기반 nginx의 경우와 비슷)

다만 사용법이 다소 까다롭다.

또한 기존에 많이 쓰이던 파이썬 웹서버 모듈들이 아직 지원하지 않는다.

현재로서 제대로 지원하는 건 같이 딸려 나온 aiohttp 정도인데,

aiohttp는 벤치마크 결과 퍼포먼스가 그리 좋지 못하다.

향후 파이썬 웹서버 중 가장 평이 좋은 tornado가 asyncio를 지원할 것이라 하니 기다려본다.