2016-10-20 2 views
1

많은 연결을받을 수있는 웹 서버를 만들 예정입니다. 이 10000 명의 연결된 사용자는 서버 번호로 보내고 서버는이 제곱 된 숫자를 사용자에게 반환합니다. 10000 연결이 너무 많고 비동기 방식이 적절합니다.어느 파이썬 라이브러리를 사용해야합니까? SocketServer 또는 Asyncio?

우리가 비동기 처리기로 ThreadingMixIn 및 ForkingMixIn 클래스를 사용할 수 있습니다 socketserver 라이브러리와

asyncio & socketserver : 내가 도움이 될 수 있습니다 파이썬 3.4에 대한 두 개의 라이브러리를 발견했다. 그러나 이것은 코어의 수에 의해 제한됩니다. 반면에 asyncio 라이브러리가 있습니다. 그리고 정확히 어떻게 작동하는지 이해하지 못합니다. 어느 쪽을 사용해야합니까? 그리고이 두 라이브러리가 함께 작동 할 수 있습니까?

답변

5

비동기 프로그래밍에는 다른 접근 방식이 있습니다.

첫 번째 방법은 스레드를 사용하여 IO 작업을 모니터링하고 이러한 작업을 비 차단 방식으로 관리하는 것입니다. 이것은 무엇 SocketServer 않습니다.

두 번째 방법은 이벤트 루프와 selector을 사용하여 주 스레드에서 IO 작업을 모니터링하는 것입니다. 이것은 비동기 프로그래밍에 대해 사람들이 일반적으로 말하는 것입니다. 이는 asyncio, twistedgevent입니다.

단일 스레드 접근 방법은 두 가지 장점이 있습니다

  • 는이 콜백은 동일한 스레드에서 실행되기 때문에 경쟁 조건의 위험을 제한을
  • 가 클라이언트 당 하나 개의 스레드를 만드는 오버 헤드를 제거한다 (10K problem 참조)

다음은 asyncio TCP server (for python 3.5)의 예입니다. 귀하의 경우, 단순히 자신의 구현으로 handle_echo 코 루틴을 대체 : 쉽게 고객의 수천을 처리 할 수 ​​있어야합니다

async def handle_client(reader, writer): 
    data = await reader.readline() 
    result = int(data.decode().strip()) ** 2 
    writer.write(str(result)).encode()) 
    writer.close() 

.

관련 문제