본문 바로가기

카테고리 없음

Python : async, await 개념, 사용방법 예제

asyncawait는 파이썬의 비동기 프로그래밍에서 사용하는 키워드로, 비동기 함수를 정의하고 실행을 중단하거나 재개하는 데 사용됩니다. 이 두 키워드를 사용하면 코드가 비동기적으로 실행되면서도 가독성을 유지할 수 있습니다. 아래에서 asyncawait의 개념, 사용 방법, 예제를 통해 자세히 설명하겠습니다.

 

1. async 키워드

async는 비동기 함수 또는 코루틴을 정의할 때 사용합니다. async def로 정의된 함수는 호출될 때 즉시 실행되지 않고, 코루틴 객체를 반환합니다. 이 코루틴 객체는 await을 사용하거나 이벤트 루프를 통해 실행할 수 있습니다. 

async def example_coroutine():
    print("비동기 함수 시작")
    await asyncio.sleep(1)  # 1초 대기
    print("비동기 함수 종료")

여기서 example_coroutine 함수는 호출되는 즉시 실행되지 않고, 코루틴 객체로 반환됩니다. 이 코루틴을 실행하려면 await으로 호출하거나 이벤트 루프를 사용해야 합니다.

 

2. await 키워드

await는 비동기 함수 내에서 다른 비동기 작업이 완료될 때까지 대기할 때 사용됩니다. await 키워드를 만나면, 해당 비동기 작업이 끝날 때까지 현재 코루틴의 실행이 중단됩니다. await는 코루틴이나 awaitable 객체(비동기 함수, asyncio.sleep 등)에만 사용할 수 있습니다.

import asyncio

async def say_hello():
    print("Hello...")
    await asyncio.sleep(1)  # 비동기적으로 1초 대기
    print("...world!")

async def main():
    await say_hello()

asyncio.run(main())

 

3. async와 await의 예제

여러 비동기 작업을 동시에 실행하는 예제를 통해 asyncawait의 사용법을 더 알아보겠습니다.

import asyncio

async def task(name, delay):
    print(f"{name} 시작")
    await asyncio.sleep(delay)  # 비동기 대기
    print(f"{name} 완료")

async def main():
    # 두 개의 코루틴을 동시에 실행
    await asyncio.gather(
        task("작업 1", 2),
        task("작업 2", 1)
    )

# 비동기 함수 실행
asyncio.run(main())

 

task 함수는 각각 delay 시간만큼 비동기적으로 대기하고 작업을 완료합니다.

main 함수는 await asyncio.gather()로 여러 코루틴을 동시에 실행합니다.

asyncio.run(main())을 통해 main 코루틴을 이벤트 루프에서 실행합니다.

 

await을 통해 각 작업의 완료를 비동기적으로 기다리며, 전체적으로 동시 실행되는 효과를 얻을 수 있습니다.

4. async와 await를 사용할 때 유의사항

 

1. 비동기 함수 내에서만 await 사용 가능: await은 반드시 async def로 정의된 함수 내부에서만 사용할 수 있습니다.

2. 비동기 I/O에 적합: asyncio.sleep, 파일 입출력, 네트워크 요청 등 비동기 I/O 작업에 특히 효과적입니다.

3. CPU 바운드 작업에는 부적합: 비동기 코드는 주로 I/O 바운드 작업에 적합합니다. CPU 바운드 작업에는 concurrent.futures와 같은 동시성 방법을 사용하는 것이 좋습니다.

 

asyncawait를 사용하면 복잡한 비동기 작업을 효율적으로 처리하면서도 코드의 흐름을 쉽게 추적할 수 있습니다.

asyncio 에 대해서는 다음 블로그에서 자세히 더 설명하도록 하겠습니다.