비동기(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)
참고
- https://www.youtube.com/watch?v=zAvWv_Wi0z0 // 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥 - 한섬기 - PyCon.KR 2019
'Python > Advanced' 카테고리의 다른 글
[Python] Circular Import에 따른 파일 구조 개선 (0) | 2023.05.29 |
---|---|
[Python] 가상환경, 패키지 관리 모듈 정리 (pyenv, pipenv, poetry, venv) (0) | 2023.02.11 |
[Python 비동기] (2) Generator, Async/await 코루틴 코드 비교 (0) | 2023.02.09 |
[Python 비동기] (1) 코루틴, 비동기 관련 용어 이해 (0) | 2023.02.08 |
[Pytest] 4. Pytest with Django (Feat. pytest-Django) (0) | 2022.11.06 |