Uvicorn으로 python 프로젝트를 실행하며 uvicorn은 무엇이고 어떻게 동작하는지 궁금하여 공부 및 정리해보기로 했다.
처음 생각은 fast api 프레임워크도 비동기를 지원하고 uvicorn도 비동기 서버를 제공하는데 과연 비동기에 대해 잘 알고 잘 사용하고 있는가로부터 시작됐다. 더 거슬러 올라가면, 누군가 내가 만든 python 프로젝트에 필요한 cpu및 메모리 스펙에 대해 알려달라고 했었다.
로컬에서 테스트해보니 내 생각대로 비동기로 흘러가지 않았고 해결하고자 공부가 필요했다.
동기와 비동기 개념
프로그래밍에서 동기(Synchronous)와 비동기(Asynchronous)는 코드의 실행 방식에 대한 두가지 중요한 개념입니다. 동기 프로그래밍은 코드가 순차적으로 실행되어 이전 작업이 완료될 때까지 다음 작업이 시작되지 않는 반면, 비동기 프로그래밍은 작업이 동시에 실행될 수 있어 더 높은 효율성을 제공합니다.
쉬운 예시, 라면 끓이는 방법으로 쉽게 설명할 수 있습니다. 동기 프로그래밍은 라면 물이 끓을때까지 아무것도 하지 않고 기다립니다. 라면 물이 끓었을때 라면을 넣습니다. 라면이 다 익을때까지 기다립니다. 라면이 다 익었다면 스프를 넣습니다. 비동기 프로그래밍은 라면 물이 끓을때까지 김치와 파를 꺼내오고 썰어둡니다. 라면 물이 끓으면 면을 넣고 익을 동안 계란을 꺼내옵니다.
이 글에서는 이러한 두 가지 프로그래밍 모델을 Uvicorn과 같은 ASGI 서버에서 어떻게 활용할 수 있는지 알아보겠습니다.
Uvicorn, ASGI 서버의 등장
Uvicorn은 Python에서 비동기 웹 프레임워크를 실행하기 위해 설계된 고성능 ASGI 서버입니다. ASGI는 “Asynchronous Server Gateway Interface”의 약자로, 기존의 WSGI(Web Server Gateway Interface)보다 더 높은 성능과 유연성을 제공합니다. 이를 통해 동기 및 비동기 요청을 처리할 수 있어, 현대적인 웹 애플리케이션에서 필수적인 도구로 자리 잡고 있습니다.
동기 프로그래밍
동기 프로그래밍은 이해하기 쉽고, 코드를 작성하기가 상대적으로 간단합니다. 모든 작업이 순차적으로 이루어지기 때문에 디버깅와 유지보수가 용이합니다. 그러나 모든 요청이 완료될 때까지 다음 요청을 처리할 수 없기 때문에 성능 측면에서는 비효율적일 수 있습니다. 특히, 네트워크 I/O 나 파일 시스템 작업과 같이 대기 시간이 긴 작업에서는 병목 현상이 발생할 수 있습니다.
장점
- 코드의 가독성 및 유지보수 용이
- 순차적인 작업 흐름으로 인한 직관성
단점
- 작업 완료 대기 시 성능 저하
- 병목 현상 발생 가능성
비동기 프로그래밍
비동기 프로그래밍은 여러 작업을 동시에 처리할 수 있어 성능이 크게 향상됩니다. Uvicorn과 같은 ASGI 서버에서 비동기 프로그래밍을 활용하면 네트워크 IO 작업을 비동기적으로 처리하여 더 많은 요청을 동시에 처리할 수 이씁니다. 그러나 비동기 코드는 복잡하며, 특히 디버깅이 어려울 수 있습니다.
장점
- 높은 성능 및 효율성
- 동시에 여러 작업 처리 가능
단점
- 코드 복잡도 증가
- 디버깅 및 유지보수 어려움
Uvicorn으로 동기 및 비동기 코드 실행하기
Uvicorn에서 동기 및 비동기 코드를 실행하는 것은 간단합니다. Uvicorn은 비동기 함수와 동기 함수를 모두 지원하며, FastAPI와 같은 프레임워크와 함께 사용될 때 비동기 함수는 ‘async def’로 정의되고, 동기 함수는 일반 ‘def’로 정의됩니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/sync")
def sync_endpoint():
# 동기 코드
return {"message": "This is a synchronous endpoint"}
@app.get("/async")
async def async_endpoint():
# 비동기 코드
return {"message": "This is an asynchronous endpoint"}
동기와 비동기 함께 사용
Uvicorn에서 동기와 비동기 코드를 함께 사용하는 것은 복잡해 보일 수 있지만, 올바르게 사용하면 매우 효과적입니다. 일반적으로 CPU 바운드 작업은 동기로 처리하고, IO 바운드 작업은 비동기적으로 처리하는 것이 좋습니다. 이를 통해 시스템의 성능을 최대화할 수 있습니다.
언제 동기, 비동기를 사용할까
동기와 비동기 프로그래밍은 각각의 장단점이 있으며, 상황에 따라 적절하게 선택하여 사용해야 합니다. Uvicorn과 같은 ASGI 서버는 이러한 선택을 유연하게 할 수 있도록 해주며, 현대적인 웹 애플리케이션 개발에서 중요한 역할을 합니다. 결국, 성능과 코드의 복잡성 사이의 균형을 어떻게 맞출 것인가에 따라 동기와 비동기를 선택하는 것이 중요합니다.
키워드
ASGI, WSGI
CPU바운드, IO바운드
uvicorn
동기,비동기
'Language, Framework > python' 카테고리의 다른 글
| python 은 객체지향 언어인가? (2) | 2024.05.14 |
|---|