[Alex] 데이터 장인의 블로그

[비동기 프로그래밍] async 함수 설명 본문

Python

[비동기 프로그래밍] async 함수 설명

Alex, Yoon 2022. 12. 5. 18:23

동기적 코드 

아래 코드는 '짜여진' 순서대로 실행된다.

때문에 식사 완료가 되기 전 mealtime 시간동안 '블로킹'이 발생하게 되고, 

이로써 최종 코드 delivery("C", 1) 구동시간까지 지연시간이 발생하게 된다. 

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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

비동기 코드 

아래 코드는 짜여진 순서와 상관없이 구동하게 된다. 

때문에 각각의 mealtime의 지연시간 동안 배달완료(I/O) 작업을 수행할 수 있으며 이로써 총 수행시간은 줄어드는 효과를 볼 수 있다.

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)

 

비동기 코드 내 동기적 실행  

만약 비동기로 수행될 필요가 없는 작업이라면 어떨까? 혹은, 비동기 작업 내 강제로 동기적으로 수행되어야 하는 작업이 있다면 어떨까? async 로 작성된 비동기 함수를 '동기적'으로 실행하려면 다음과 같이 표현한다. 

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():
	await delivery("A", 1)
    await delivery("B", 2)
    await delivery("C", 3)

if __name__ == "__main__":
    start = time.time()
    asyncio.run(main())
    end = time.time()
    print(end - start)

 

그 밖에 async 함수 설명 

# 코루틴 hello world!
# https://docs.python.org/ko/3/library/asyncio-task.html

import asyncio # python 스크립트에서 async 함수를 사용할 수 있게끔 도와주는 라이브러리

# awaitable 객체란? 
# 코루틴, 태스크, 퓨처 

# 코루틴 함수 -> async def hello_world():
# 코루틴 함수2 -> await asyncio.sleep(mealtime)

# 태스크 객체 : 미리 예약된 작업
# task1 = asyncio.create_task(hello_world())
# await task1 

# 위 작업은 아래 작업과 동일하다. 
# await hello_world() 

async def hello_world():
    print("hello world")
    return 123

if __name__ == "__main__":
    asyncio.run(hello_world()) # async로 작성된 함수를 실행하려면 다음과 같이 작성해야 한다.

 

반응형
Comments