인프런 커뮤니티 질문&답변

인프린님의 프로필 이미지
인프린

작성한 질문수

파이썬 API 마스터! FastAPI

미들웨어와 라우팅!

async, await 질문

해결된 질문

작성

·

215

1

안녕하세요.

비동기처리 관련하여 질문드립니다.

async 키워드가 비동기로 처리하기 위한 함수의 선언이고 실제 비동기 처리가 이루어져야 하는 부분은 await 키워드를 붙여주는데 여기서 await 설명해주실 때 헷갈리는 부분이 있어서요.

 

  1. 비동기는 코드를 순차적으로 기다리지 않고 작업이 완료되지 않아도 그 다음 코드를 실행하는 방식이고, 여기서 await 키워드는 해당 작업이 끝나는 걸 기다리게 하는 키워드로 알고 있는데 설명해 주실 때

해당 함수가 끝날 때까지 현재 함수를 일시 정지한다.

고 하셨는데 여기서 해당 함수는 뭐고 현재 함수는 뭘 말하는 건가요 ?

해당 함수는 await 키워드가 붙은 작업을 의미하고 현재 함수는 이 await 작업을 포함하고 있는 함수를 의미 하나요 ?

그리고 만약 이게 맞다면 await 키워드가 붙은 작업이 실행되는 동안 그 작업이 포함된 함수가 아닌 다른 작업들은 수행이 되는 거죠 ? (쓰레드가 따로 생성되서 처리되는 걸로 아는데 이게 맞는건지 ...)

  1. 자바스크립트 쪽에서 async / await 관련된 설명들을 좀 보면

    await 키워드를 쓰면 비동기가 강제적으로 동기 처리가 되어 코드가 순차적으로 수행된다고 표현하는 글들이 종종 있던데 fast api 에서도 같은 개념인가요 ? 비동기 처리를 위해 작성한 코드인데 강제 동기 처리가 된다는 게 이해가 안갑니다.

감사합니다.

 

 

 

답변 1

0

배코블린님의 프로필 이미지
배코블린
지식공유자

안녕하세요! 다시 뵈서 반갑습니다 🙂

비동기 처리와 async/await 키워드에 대한 질문 잘 읽어보았습니다.

비동기 처리와 async/await에 대한 상세 설명

혼란스러운 부분을 해결해 드리고, Python의 asyncio와 JavaScript의 비동기 처리 방식의 차이점까지 짚어 드리겠습니다.

핵심 개념 정리

  • 비동기 처리: 시간이 오래 걸리는 작업(예: 네트워크 요청, 파일 읽기/쓰기)을 기다리는 동안 다른 작업을 수행하여 전체 프로그램의 응답성을 높이는 방식입니다.

  • async 키워드: 함수를 코루틴(coroutine)으로 만들어줍니다. 코루틴은 await 키워드를 사용하여 비동기 작업을 일시 중지하고 재개할 수 있는 특별한 함수입니다.

  • await 키워드: 코루틴 내에서 사용되며, 비동기 작업이 완료될 때까지 코루틴의 실행을 일시 중지합니다. 작업이 완료되면 결과를 반환하고 코루틴의 실행을 재개합니다.

모든 걸 동시에 한다 보다는 현재 함수가 오래 걸리는 일을 할 때 다른 작업을 먼저 한다고 생각하시는 게 더 편하실 거에요!

용어 명확화

  • "해당 함수": await 키워드 바로 뒤에 오는 비동기 작업을 수행하는 함수를 의미합니다. 예를 들어 await asyncio.sleep(1)에서 "해당 함수"는 asyncio.sleep(1)입니다.

  • "현재 함수": await 키워드를 포함하고 있는 코루틴 함수를 의미합니다.

await 동작 방식 상세 설명

  1. 코루틴 함수 내에서 await 키워드를 만나면, await 뒤의 비동기 작업이 실행됩니다.

  2. 비동기 작업이 진행되는 동안, 현재 코루틴 함수는 일시 중지되고 제어권이 이벤트 루프(event loop)로 넘어갑니다.

  3. 이벤트 루프는 다른 코루틴이나 작업을 실행하면서 비동기 작업의 완료를 기다립니다.

  4. 비동기 작업이 완료되면, 결과 값을 가지고 일시 중지되었던 코루틴 함수로 돌아와 실행을 재개합니다.

예시 코드

Python

import asyncio

async def my_coroutine():
    print("코루틴 시작")
    await asyncio.sleep(1)  # 1초 동안 일시 중지
    print("코루틴 재개")

async def main():
    await asyncio.gather(my_coroutine(), my_coroutine())  # 두 코루틴 동시 실행

asyncio.run(main())

FastAPI와 비동기 처리

FastAPI는 비동기 프레임워크이므로, async/await를 사용하여 I/O 작업을 효율적으로 처리할 수 있습니다. await를 사용하더라도 I/O 작업 중에는 다른 요청을 처리할 수 있으므로 전체적인 성능이 향상됩니다.

JavaScript와의 차이점

JavaScript에서도 async/await를 사용하지만, Python과는 미묘한 차이가 있습니다. JavaScript의 await는 Promise 객체를 반환하는 함수에 사용되며, Promise가 처리될 때까지 해당 async 함수의 실행을 일시 중지합니다.

결론

await 키워드는 비동기 작업을 기다리는 동안 다른 작업을 수행할 수 있도록 해주는 핵심적인 역할을 합니다. FastAPI와 같은 비동기 프레임워크에서는 await를 적절히 활용하여 I/O 병목 현상을 줄이고 성능을 극대화할 수 있습니다.

궁금한 점이 있다면 언제든지 다시 질문해주세요.

인프린님의 프로필 이미지
인프린

작성한 질문수

질문하기