[파이썬] aiohttp에서의 `async/await` 활용

Python의 aiohttp 패키지는 비동기 웹 서버 및 웹 클라이언트를 구축하기 위한 높은 수준의 API를 제공합니다. 이러한 비동기 프레임워크는 asyncio의 async/await 문법을 활용하여 효율적인 웹 서비스를 구현할 수 있게 해줍니다.

async/await는 Python 3.5 이상에서 도입된 비동기 프로그래밍 패턴으로, 코드를 비블로킹 방식으로 작성할 수 있게 합니다. 이를 통해 한 번에 여러 개의 I/O 작업을 동시에 처리할 수 있어 웹 서버 및 클라이언트에서 높은 동시성과 성능을 달성할 수 있습니다.

aiohttp의 기본 사용법

aiohttp를 사용하여 HTTP GET 요청을 보내는 예를 살펴보겠습니다. 먼저, aiohttp 패키지를 설치해야 합니다.

pip install aiohttp

다음은 aiohttp를 사용하여 웹 페이지의 내용을 가져오는 간단한 예제입니다.

import aiohttp
import asyncio

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, 'https://example.com')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

위의 예제에서 fetch 함수는 aiohttp 세션과 URL을 매개변수로 받아 해당 URL에서 내용을 가져옵니다. response.text()는 비동기적으로 응답의 내용을 가져오는 메서드입니다. main 함수에서는 aiohttp의 ClientSession()을 사용하여 세션을 생성하고, fetch 함수를 호출하여 페이지의 내용을 가져옵니다.

aiohttp에서의 async/await 활용

aiohttp에서 async/await를 활용하여 비동기적으로 여러 개의 요청을 동시에 처리할 수 있습니다. 예를 들어, 동시에 여러 개의 URL에서 내용을 가져와야 하는 경우 asyncio.gather 함수를 사용하여 병렬로 요청을 처리할 수 있습니다.

import aiohttp
import asyncio

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:
        urls = ['https://example.com', 'https://example.org', 'https://example.net']
        coroutines = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*coroutines)
        for result in results:
            print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

위의 예제에서는 urls 리스트에 여러 개의 URL을 저장하고, 각 URL별로 fetch 함수가 실행되도록 합니다. asyncio.gather 함수는 각각의 비동기 함수(coroutine)를 동시에 실행하고, 결과를 반환합니다. 이렇게 병렬로 요청을 처리하면 응답 시간이 크게 단축되며, 전체적인 성능이 향상됩니다.

결론

aiohttp에서 async/await 패턴을 활용하면 비동기 웹 서버 및 웹 클라이언트를 효율적으로 구축할 수 있습니다. 이를 통해 동시성과 성능을 향상시키며, 마이크로서비스 아키텍처나 분산 시스템 등의 다양한 웹 애플리케이션을 개발할 수 있습니다. 시간이 많이 걸리는 I/O 작업을 비블로킹으로 처리하여 애플리케이션의 응답시간을 줄이고, 사용자 경험을 향상시키는 결과를 얻을 수 있습니다.