Uvicorn is an ASGI web server implementation for Python.
Uvicorn은 ASGI App을 실행시켜주는 ASGI server입니다.
Uvicorn 덕에 Non-Blocking I/O를 통한 비동기 처리가 가능하고, 이는 Uvicorn 내부의 이벤트 루프를 통해서 실현이 가능합니다.
클라이언트의 요청이 왔을 때, 어떻게 실행되는지 흐름대로 적어보겠습니다.
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(app(scope, receive, send)) # app 함수는 FastAPI 내부의 __call__ 함수를 호출합니다.
* asyncio의 기본 이벤트 루프와, uvloop의 libuv(Node.js의 그 이벤트 루프) 기반의 이벤트 루프를 선택할 수 있습니다.
coroutine_obj = handler(**kwargs)
result = await coroutine_obj
* handler는 async def 함수이고, coroutine_obj는 코루틴 객체입니다.
__await__() 함수 실행.coro = some_async_func()
awaitable = coro.__await__()
-> 대기하던 큐들이 작업이 완료되면 콜백으로 Task.wakeup() or Future.set_result() 등을 통해서 _ready 큐로 들어가 남은 작업은 완료하게 됨.