본문 바로가기
Python

Python async/await

by bryan.oh 2024. 1. 26.
반응형

 Python에서 async/await를 사용하면 비동기 코드를 동기 코드처럼 간단히 작성할 수 있습니다. 

async/await는 Python 3.5 버전부터 지원하는 기능으로, asyncio 모듈을 기반으로 동작합니다. 

기본 사용법은 다음과 같습니다:


import asyncio

async def main(): 
  print('hello')
  await asyncio.sleep(1) 
  print('world')

asyncio.run(main())




- async def로 비동기 함수를 정의합니다.
- await를 사용하여 비동기 함수 안에서 다른 비동기 함수를 호출할 수 있습니다. 
- asyncio.run으로 비동기 함수를 실행합니다.

이렇게 하면 hello를 출력하고 1초 기다린 후 world가 출력되는 비동기 코드를 매우 간단히 작성할 수 있습니다.

await를 사용하면 비동기 함수가 끝날 때까지 대기하기 때문에 동기 코드처럼 보이지만, 실제로는 해당 함수가 완료될 때까지 다른 작업을 할 수 있습니다.

다음은 파일을 읽는 비동기 함수의 예제입니다:


import asyncio
import aiofiles
import time

async def read_file(file):
    print(f'Reading {file}')
    async with aiofiles.open(file, mode='r') as f:
        text = await f.read()
    print(f'{file} was {len(text)} bytes')
    await asyncio.sleep(1)
    return text

async def main():
    await asyncio.gather(
        read_file('file1.txt'),
        read_file('file2.txt')
    )

start = time.time()
asyncio.run(main())
end = time.time()
print(f'Took {end - start} seconds')



- asyncio.gather을 사용하여 여러 비동기 함수를 병렬로 실행할 수 있습니다.
- 각 파일을 읽는 동안 asyncio.sleep으로 1초 기다리는 시간이 겹쳐져 총 실행 시간이 1초밖에 안 걸립니다.

더 많은 예.

import asyncio

async def first_coroutine():
    print("First Start")
    await asyncio.sleep(2)
    print("First End")

async def second_coroutine():
    print("Second Start")
    await asyncio.sleep(1)
    print("Second End")

async def main():
    await asyncio.gather(first_coroutine(), second_coroutine())

asyncio.run(main())

 

import asyncio
import aiohttp  # 비동기 HTTP 요청을 위한 라이브러리

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, "http://example.com")
        print(html)

asyncio.run(main())

이 예제에서는 first_coroutine과 second_coroutine 두 코루틴을 asyncio.gather()를 통해 동시에 실행합니다. first_coroutine이 2초, second_coroutine이 1초 대기하는데, 이들은 동시에 실행되므로 전체 실행 시간은 2초입니다.

 

결론

이처럼 async/await를 사용하면 병렬 처리가 간단해지는 장점이 있습니다. 동기 코드로 작성하기 어려운 복잡한 비동기 로직도 매우 간결하게 표현할 수 있습니다.

다만 async/await는 단순히 문법 상당의 기능으로, 그 자체로 병렬 처리를 보장하는 것은 아닙니다. 실제 병렬 실행을 위해서는 asyncio 모듈과 적절한 프로그래밍이 필요합니다.

 

728x90
반응형

댓글