FastAPI
-
await vs create_taskFastAPI 2025. 9. 14. 19:19
await 와 create_task 모두 코루틴 객체를 이벤트 루프에 등록하고 실행하는 명령어이다.하지만 호출자의 즉각적인 제어권 획득 여부에 따른 차이점이 존재한다. [ await ] 1. 코루틴 객체 생성하고 이벤트 루프에 등록하여 실행2. 이벤트 루프가 바로 이 코루틴을 실행해서 Future를 반환할때까지 기다림 → 즉, await를 쓰는 순간 제어권을 양보하고, 결과값이 반환될때까지 해당 코루틴 흐름은 멈춤[ create.task ] 1. 코루틴 객체 생성하고 이벤트 루프에 등록하여 실행2. 현재 코루틴은 해당 코루틴 객체를 이벤트 루프 등록과 동시에 곧바로 제어권을 반환받음3. Future 반환을 기다리지 않고 자신의 코루틴 흐름을 계속해서 진행4. 이후 await task로 미리 실행시켜놓은 ..
-
FastAPI의 동기 함수 처리FastAPI 2025. 9. 14. 18:04
async endpoint 함수들은 모두 FastAPI(Starlette)이 내부적으로 ThreadPoolExecutor를 사용해서 백그라운드 스레드에서 실행한다. 하지만, 동기 함수가 다른 함수 내부에서 호출될때는 자동으로 Thread Pool로 들어가지 않는다. 따라서 동기 함수로 인해 Main Thread 자체가 멈추지 않게 하기 위해서는 직접 Thread Pool에 위임해줘야한다![만약 동기 함수 endpoint가 Main Thread에서 처리된다면?] FastAPI(Uvicorn)의 Main Thread는 Single Thread로 동작한다.그리고 코루틴 객체들을 실행시키는 Event Loop는 싱글 스레드에서 돌아간다. 하지만 만약 동기 함수를 Main Thread에서 그대로 처리한다면,동기함..
-
asyncioFastAPI 2025. 9. 13. 20:16
이벤트 루프를 직접 다룰 수 있는 라이브러리 [ run ] 프로그램의 Main Coroutine을 실행할때 사용된다. create_task와 동일하게 코루틴 객체를 Task로 감싸 이벤트 루프에서 실행한다.하지만 이벤트 루프 하나를 생성해준다는 중대한 차이점이 있다 1. 새로운 이벤트 루프 생성2. Task로 감싸서 루프에 등록하고 실행3. 해당 Task가 끝나면 이벤트 루프도 종료함→ 만약 Main Task 내 서브태스크(서브 코루틴)들이 존재하면 해당 서브 코루틴들이 끝날때까지 종료하지 않음 FastAPI 사용할때 서버 자체를 asyncio.run 으로 하지 않는 이유는Uvicorn이 대신 서버를 띄울때 이벤트 루프 하나를 생성해주기 때문이다!그리고 해당 이벤트 루프에 전체 서버 어플리케이션을 올려준..
-
coroutineFastAPI 2025. 9. 13. 20:16
Python에서 async def 로 정의된 함수들은 보통 함수처럼 즉시 실행되지 않는다.async def foo(): return 42result = foo()print(result) async 함수를 호출하여 출력해보면 42가 아니라 코루틴 객체에 대한 정보가 출력된다. Python에서 async def는 서브루틴이라고 불리는 일반 def로 정의된 함수와는 달리 코루틴 함수라고 불린다.이 코루틴 함수를 호출하면 코루틴 객체를 반환한다.따라서 위와 같은 coroutine object가 존재한다는 내용이 출력된 것이다. 이렇게 await을 쓰지 않으며 함수를 호출하면 코루틴 객체만 생성되지, 이벤트 루프에 등록되지는 않는다.→ 그냥 실행 준비물만 생겼다고 이해하면 된다. [await와 asyncio..
-
비동기 작동원리FastAPI 2025. 9. 13. 20:15
FastAPI도 Node.js와 동일하게 이벤트 루프를 기반으로 하여 비동기를 지원하는 프레임워크이다. async def로 정의된 비동기 함수들은 코루틴 객체로 생성되어 Task로 감싸져 Event Loop에 등록되게 된다.Event Loop는 각 코루틴 객체들을 번갈아가며 실행하여 동시성을 실현한다 비동기 프로그래밍은 작업 실행의 흐름이 차단되지 않고, 프로그램이 여러 작업을 효율적으로 처리할 수 있는 방식이다.동기 프로그래밍에서 한 작업이 실행되면, 해당 작업이 완료될 때까지 프로그램의 다른 부분이 대기하는 것과 대비된다.이처럼 비동기 프로그래밍에서 흐름이 차단되지 않도록 가능케하는 것이 이벤트 루프이다. 그리고 이벤트 루프는 싱글스레드에서 동작한다.정리하면 이벤트 루프는 싱글 스레드 환경에서 비동기..
-