Inflearn brand logo image

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

yoonjong.kim님의 프로필 이미지
yoonjong.kim

작성한 질문수

실전! FastAPI 활용(비동기)

Event Loop 알아보기

Event Loop 관련 질문드립니다.

해결된 질문

작성

·

58

0

Event Loop에서 질문이 있습니다.

저는 await task()을 하면 작업 큐에 등록된 후 차례가 되면 실행이 되는 것으로 이해를 하였는데

그러면 다음과 같은 코드에서,

import asyncio


async def inner_task():
    print(f"inner_task 시작")
    await asyncio.sleep(1)
    print(f"inner_task 완료")
    return "inner 결과"

async def outer_task(n):
    print(f"outer_task {n} 시작")
    results = await inner_task()
    print(f"outer_task {n} 완료")
    return results

async def main():
    await asyncio.gather(outer_task(1), outer_task(2), outer_task(3))


asyncio.run(main())

먼저 큐에 등록된 outer_task들이 먼저 동작을 하는 것으로 예상을 하였지만 먼저 들어간 outer_task보다 내부의 inner_task가 먼저 동작을 하였습니다.

하지만 outer_task에 gather을 사용하여 여러 task를 await하면, 모든 outer_task 이후에 작동을 하는 데 혹시 작동원리가 다를까요?

 

답변 2

0

신동현님의 프로필 이미지
신동현
지식공유자

안녕하세요,

현재 작성하신 코드 기준으로 설명드립니다.

가장 먼저 main 코루틴이 실행되며 gather()로 전달하는 3개의 코루틴이 순차적으로 실행됩니다. 그런데 현재 각각의 outer 코루틴 안에 inner 코루틴에서 asyncio.sleep()이 동작하기 때문에 첫번째 outer 코루틴과 inner 코루틴은 실행 중간에서 제어권을 반환합니다.

따라서 첫번째 outer 코루틴과 inner 코루틴이 실행 종료되기 전에 두번째 outer 코루틴이 실행되고, 같은 이유로 두번째 코루틴 종료 전에 세번째 outer 코루틴이 실행됩니다.

그렇기 때문에 최종적으로 모든 outer 코루틴과 inner 코루틴이 실행되고, 1초가 지나 제어권을 다시 획득하는 순서대로(1 -> 2 -> 3) inner 코루틴과 outer 코루틴이 종료됩니다.

 

0

안녕하세요, 인프런 AI 인턴입니다. yoonjong.kim님.

비동기 코드에서 asyncio.gather() 함수를 사용하면 제공된 await들이 동시에 실행되게 스케줄링됩니다. 그리고 각 outer_taskinner_task를 호출하고, inner_taskawait asyncio.sleep(1)을 통해 이벤트 루프에 제어를 넘깁니다. 이 과정에서 모든 outer_task(각각의 inner_task 포함)가 거의 동시에 스케줄링되며, Python의 이벤트 루프에 의해 대부분의 병렬 실행이 이루어집니다.

여기서 핵심은 inner_taskawait asyncio.sleep(1) 줄이 이벤트 루프에 제어를 넘긴다는 점입니다. 그러면 다른 작업이 대기 상태에서 실행될 수 있게 되어, 내부의 inner_task들이 서로 독립적인 비동기 작업으로 실행됩니다.

asyncio.gather()를 사용하지 않는다면, await는 자연스럽게 하나의 작업을 완료하고 다음 작업으로 전환됩니다. 즉, 개별적으로 await를 처리하게 됩니다. 다만, gather()를 사용하면 모든 제공된 태스크가 동시에 시작되므로, 이벤트 루프는 가장 먼저 await한 지점(inner_task)에 의해 다음 작업을 스케줄링합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

yoonjong.kim님의 프로필 이미지
yoonjong.kim

작성한 질문수

질문하기