Python/Advanced

[Python 비동기] (3) Library, Framework 특징 비교

yubi5050 2023. 2. 9. 19:14

비동기(Asynchronous)란?

👉 Sync vs Async 차이

  • Synchronous : 함수 A는 함수 B의 수행 상태를 신경쓰며, 계속 상태를 체크 (완료됬는지)
  • Asynchronous : 함수 A는 함수 B의 수행 상태를 신경쓰지 않고, B 혼자 알아서 진행 후 Callback 반환

즉, 호출된 함수(B)를 호출한 함수(A)가 신경쓰는지, 호출된 함수(B)가 알아서 하는지에 따라 동기/비동기

 

👉 비동기의 가장 큰 장점

  • 주어진 자원을 최대한 활용하여, 순차 코드, 일괄 처리 보다 I/O 부하를 더 빠르게 처리할 수 있다는 점

 

즉 비동기란, 실행 작업의 완료 Callback 도착 전까지 메인 프로세스/스레드는 멈추지 않고, 다른 작업을 수행하며 주어진 자원을 최대한 활용하는 것

 

👉 비동기라는 동기보다 빠르다?

  • 일반적으로 비동기는 동일한 양의 요청을 사용하는 스레드 및 프로세스 수를 줄이는 데 도움이 되는 것
  • 무조건 빠르다가 아님 => async != faster 

 

Asynchronous Library 특징 비교 - Asyncio, uvloop, AIOHTTP

👉 Asyncio

  • asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리
  • 파이썬 코루틴들 동시 실행 가능 (3.5 이후 python에 기본 추가)
  • 자식 프로세스 실행 및 제어 가능 (비동기 Task들에 대한 이벤트 루프를 만들고 관리)
  • Link : https://docs.python.org/ko/3/library/asyncio.html

 

👉 uvloop

  • python의 asyncio의 이벤트 루프 담당
  • uvloop는 Cython으로 구현되었으며, libuv를 기반으로 함
  • github : https://github.com/MagicStack/uvloop
  • 2023 2월 기준 (star : 9.2k , fork : 534)

 

👉 AIOHTTP

  • Asyncio를 사용하는 비동기 HTTP Client이자 Server 구축 가능 Library
  • Server와 Client 모두 WebSocket 지원
  • 웹서버로는 Middleware와 Signal을 제공
  • Github : https://github.com/aio-libs/aiohttp
  • 2023 2월 기준 (star : 13.2k , fork : 1.9k)

 

Asynchronous Framework 특징 비교 - FastAPI, Sanic, Torando

👉 FastAPI 

  • 코어 시스템 (Starlette) Wrapping을 통한 ASGI 지원
  • Pydantic을 통한 간편한 유효성(Validation) 검사의 장점
  • 모던 파이썬 문법과 타입 힌트 제공
  • OpenAPI 문서 자동 생성 (생성된 문서에서 API 테스트 바로 가능), Swagger
  • 동시성 상황에서 빠름
  • github : https://github.com/tiangolo/fastapi
  • 2023 2월 기준 (star : 54.3k , fork : 4.5k)

 

👉 Sanic

  • 높은 성능의 HTTP 서버를 쉽게 구축하고, 확장할 수 있도록 만드는 것이 목표
  • Blueprints  서브 라우팅 기능 제공
  • uvloop 기반의 비동기 HTTP를 빠르게 처리할 수 있는 라이브러리
  • Github : https://github.com/sanic-org/sanic
  • 2023년 2월 기준 (star : 16.8k , fork : 1.5k)

 

👉 Tornado

  • 파이썬 웹 프레임워크 겸, 비동기 네트워크 라이브러리
  • Python 2.x 비동기로 많이 사용됨
  • Http의 클라이언트와 서버 둘다 제공
  • 코루틴 라이브러리 Tornado.gen과 yield 문법을 통해 비동기 직접 구현
  • tornado와 aiohttp를 사용시 비동기 I/O 스택을 직접 제어 가능
  • Github : https://github.com/tornadoweb/tornado
  • 2023 2월 기준 (star : 21k , fork : 5.5k)

 

참고