[Fast API] 동기 vs 비동기

seoryeong·2023년 6월 19일
0

FastAPI

목록 보기
3/5
post-thumbnail

동기(sync)비동기(async)
코드가 동기적으로 동작한다
= 코드가 작성된 순서 그대로 실행된다.
코드가 비동기적으로 동작한다
= 코드가 반드시 작성된 순서 그대로 실행되는 것은 아니다.

짜장면을 배달하는 배달부
→ 하나의 주문에서 짜장면 배달부가 처리해야할 일은 아래와 같다.

delivery_func:
1. 짜장면을 주문자에게 배달한다.
2. 해당 주문자가 다 먹은 그릇을 현관 앞에 놓으면 배달부는 그 그릇을 수거한다.

만약 주문자가 3명(A,B,C)라고 하자.
현재 상황: A,B,C가 주문이 접수되고 배달부는 A,B,C 짜장면을 음식점에서 받은 상황

📝동기(sync)

import time

def delivery(name, mealtime):
	print(f"{name}에게 배달완료!!")
    time.sleep(mealtime)
    print(f"{name} 식사완료, {mealtime} 시간 소요...")
    print(f"{name} 그릇 수거 완료")
    
def main():
	delivery("A", 5)
    delivery("B", 3)
    delivery("C", 4)
    
if __name__ == "__main__":
	start = time.time()
    main()
    end = time.time()
    print(end-start)

A → B → C 순서대로 동작한다.

📝비동기(async)

import time
import asyncio

async def delivery(name, mealtime):
	print(f"{name}에게 배달 완료!!")
    await asyncio.sleep(time)
    print(f"{name} 식사완료, {mealtime} 시간 소요...")
    print(f"{name} 그릇 수거 완료")
    
async def main():
	delivery("A", 10),
    delivery("B", 3),
    delivery("C",4)
    
if __name__ == "__main_":
	start = time.time()
    asyncio.run(main())
    end = time.time()
    print(end-start)

async라는 코루틴함수를 통해 비동기함수를 만들어 동시성프로그래밍이 가능하도록 하였다.

동기함수를 사용할 때는 시간이 12초 걸렸는데,
비동기 함수를 사용할 때는 시간이 5초 걸린 것을 확인할 수 있다.

그러면 비동기함수를 동기적으로 구현하려면 어떻게 하는가?

import time
import asyncio

async def delivery(name, mealtime):
	print(f"{name}에게 배달 완료!!")
    await asyncio.sleep(mealtime)
    print(f"{name}식사 완료, {mealtime} 시간 소요...")
    print(f"{name}그릇 수거 완료")
    
async def main():
	await delivery("A", 5)
    await delivery("B", 3)
    await delivery("C", 4)
    
if __name__ == "__main__":
	start = time.time()
    asyncio.run(main())
    end = time.time()
    print(end-start)

await : 단순히 비동기를 동기로 기다린다는 의미가 아니라,
비동기 함수를 처리할 때 사용하는 키워드이다.

profile
파이썬 개발자입니다.

0개의 댓글