동기(sync) | 비동기(async) |
---|---|
코드가 동기적으로 동작한다 = 코드가 작성된 순서 그대로 실행된다. | 코드가 비동기적으로 동작한다 = 코드가 반드시 작성된 순서 그대로 실행되는 것은 아니다. |
짜장면을 배달하는 배달부
→ 하나의 주문에서 짜장면 배달부가 처리해야할 일은 아래와 같다.
delivery_func:
1. 짜장면을 주문자에게 배달한다.
2. 해당 주문자가 다 먹은 그릇을 현관 앞에 놓으면 배달부는 그 그릇을 수거한다.
만약 주문자가 3명(A,B,C)라고 하자.
현재 상황: A,B,C가 주문이 접수되고 배달부는 A,B,C 짜장면을 음식점에서 받은 상황
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 순서대로 동작한다.
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 : 단순히 비동기를 동기로 기다린다는 의미가 아니라,
비동기 함수를 처리할 때 사용하는 키워드이다.