동기(sync)

코드가 동기적으로 동작한다

⇒ 코드가 반드시 작성된 순서 그대로 실행된다.

비동기(Async)

코드가 비동기적으로 동작한다

⇒ 코드가 반드시 작성된 순서된 순서 그대로 실행되는 것이 아니다.

비동기 코드

import time
import asyncio

async def delivery(name, mealtime):
    print(f"{name}에게 배달 완료!")
    await asyncio.sleep(mealtime)
    # await : 비동기 -> 동기
    print(f"{name} 식사 완료, {mealtime}시간 소요...")
    print(f"{name} 그릇 수거 완료")
    return mealtime
# 비동기 함수는 atomic한 연산을 요구할 때는 좋지 않다 (덧셈과 같은 사칙연산들)
# 요청을 받고 응답을 받는 류의 코드에 유용
# 비동기 처리는 코드가 진행되다가 다른 함수를 처리하고 다시 이어서 진행하기도 한다
# 코드가 반드시 작성된 순서대로 진행되지 않는다는 것
# 비동기 함수를 async 키워드를 붙여서 코루틴 함수라고 부른다.

async def main():

    result = await asyncio.gather(
        delivery("A", 1),
        delivery("B", 2),
        delivery("C", 3),
    )

    print(result)

# 비동기 함수에서 총 처리 시간은 가장 늦게 먹는 mealtime 이다.
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.0022270679473877

동시에 태스크 실행하기

*awaitable* asyncio.**gather**(**aws*, *return_exceptions=False*) aws 시퀀스에 있는 어웨이터블 객체를 동시에 실행합니다. aws에 있는 어웨이터블이 코루틴이면 자동으로 태스크로 예약됩니다. 모든 어웨이터블이 성공적으로 완료되면, 결과는 반환된 값들이 합쳐진 리스트입니다. 결과값의 순서는 aws에 있는 어웨이터블의 순서와 일치합니다.

동기적 실행

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", 1)
    delivery("C", 1)

# 동기적 진행
if __name__ == "__main__":
    start = time.time()
    print(main())  # None
    end = time.time()
    print(end - start)
A에게 배달 완료!
A 식사 완료, 1시간 소요...
A 그릇 수거 완료
B에게 배달 완료!
B 식사 완료, 1시간 소요...
B 그릇 수거 완료
C에게 배달 완료!
C 식사 완료, 1시간 소요...
C 그릇 수거 완료
None
3.007473945617676