Python 동기(Synchronous)와 비동기(Asynchronous) (1)
이번 포스팅은 인프런 강좌인
파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)에서 배운 내용을 기반으로 정리한 것입니다.
동기와 비동기란?
동기(Synchronous)란,
“순서대로 작동하는 것”을 연상할 수 있습니다.
비동기(Asynchronous)란,
“순서대로 작동하지 않는 것”을 연상할 수 있는데, 이를 파이썬 코드에 적용한다면,
코드가 작성된 순서대로 작동하지 않는 것을 의미합니다.
이를 파이썬 코드와 함께 살펴보겠습니다.
동기와 비동기 코드 예제
음식 배달을 하는 상황을 가정해 보겠습니다.
A, B, C의 사람에게 각각 음식을 배달할 것이고, 이를 동기적 코드로 작성해보면 다음과 같습니다.
동기적(Synchronous)
import time
def delivery(name, mealtime):
print(f"{name}에게 배달 완료!")
time.sleep(mealtime)
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
def main():
delivery("A", 1)
delivery("B", 2)
delivery("C", 3)
if __name__ == "__main__":
start = time.time()
print(main())
end = time.time()
print(end - start)
이에 대한 결과는 아래와 같습니다.
A에게 배달 완료!
A 식사 완료, 1시간 소요...
A 그릇 수거 완료
B에게 배달 완료!
B 식사 완료, 2시간 소요...
B 그릇 수거 완료
C에게 배달 완료!
C 식사 완료, 3시간 소요...
C 그릇 수거 완료
None
6.02433443069458
위의 출력결과를 살펴보면, A에게 배달을 하고, A가 식사를 마칠 때까지 기다립니다.
그 다음, A의 작업이 마무리되면 B로 배달을 하고, 같은 작업을 C까지 반복합니다.
결론적으로, 동기적 코드에서는 A->B->C 의 순서대로 코드가 실행되는 것을 알 수 있습니다.
그렇다면 위의 상황을 비동기적 코드로 작성하면 어떨까요?
비동기적(Asynchronous)
import time
import asyncio
async def delivery(name, mealtime):
print(f"{name}에게 배달 완료!")
await asyncio.sleep(mealtime)
print(f"{name} 식사 완료, {mealtime}시간 소요...")
print(f"{name} 그릇 수거 완료")
return mealtime
async def main():
result = await asyncio.gather(
delivery("A", 1),
delivery("B", 2),
delivery("C", 3),
)
print(result)
if __name__ == "__main__":
start = time.time()
asyncio.run(main())
end = time.time()
print(end - start)
이에 대한 출력은 다음과 같습니다.
A에게 배달 완료!
B에게 배달 완료!
C에게 배달 완료!
A 식사 완료, 1시간 소요...
A 그릇 수거 완료
B 식사 완료, 2시간 소요...
B 그릇 수거 완료
C 식사 완료, 3시간 소요...
C 그릇 수거 완료
[1, 2, 3]
3.0190625190734863
두 코드의 결정적인 차이는 바로 마지막 결과인 시간입니다.
동기적 코드 : 6초 비동기적 코드 : 3초
같은 작업을 수행하는데에 있어 비동기적 코드가 2배가량 빠르게 처리했습니다.
이 부분에서 비동기적 프로그래밍의 필요성을 살펴볼 수 있습니다.
비동기적인 경우, 작성된 코드의 순서대로 작동하지 않기 때문에 주어진 태스크를 더 빠르게 수행할 수 있습니다.
그렇다면 어떻게 비동기적 코드를 짜고, 어떤 상황에 활용할 수 있을까요?
이 해답을 위해 비동기 코드에서 사용된 asyncio 라이브러리에 대한 설명과 그 활용법에 대해서 다음 포스팅에 이어서 살펴보겠습니다.
Keep Steady & Do not give up
댓글남기기