FastAPI를 하면서 파이썬의 비동기 프로그래밍을 접해보았다. 하지만 정확한 이해 없이 마구잡이로 async를 하니, 속도가 오히려 떨어지는 상황을 겪게되는 경우가 있었다.
이러한 사태를 다시 겪지 않기 위해 기초부터 다시 찾아보기로 했다.
우선 둘의 차이점을 먼저 말하고 가는 것이 뒷부분을 이해하는데 편할 것 같다.
작업을 수행하는 2개 이상의 주체가 시작, 종료 시간을 서로 맞출 것인지?
작업 요청을 했을 때 요청의 결과값(return)을 직접 받는 것이다
def a():
# do something
return 1
def b():
# do something
return 2
def c():
# do something
return 3
def d():
# do something
return 4
def main():
print(a())
print(b())
print(c())
print(d())
# 1 2 3 4
호출한 함수가 작업 완료를 신경 쓴다. → 작업이 끝날때까지 기다린다.
이 2개를 유머로 표현한 것이 있다.
컵라면을 만드는 함수가 있다고 했을때, 7개를 순차적으로 쓰고 실행을 한다면 동기적으로 실행되어 7개의 컵라면이 모두 완성될때까지 21분이 걸리는 것이다.
def make_ramyeon():
# wait 3 minutes
return ramyeon
def main():
results = []
for _ in range(7):
results.append(make_ramyeon())
return results
하지만 비동기로 실행했을 때는 각 함수들이 동시에 실행되어 약 3분이면 모든 작업이 끝나게 되는 것이다.
실행 제어권을 돌려주는가? 안돌려주는가?
이렇게 봐도 뭔가 비슷해 보인다. 하지만 관점이 다르다는 것을 명심해야한다.
호출되는 함수가 바로 return 하는지 (제어권을 넘기는가)가 관심사이다
호출되는 함수의 작업 완료 여부(기다리는가)를 누가 신경쓰느냐가 관심사이다.