[python] aiohttp를 사용하여 동시에 여러 개의 HTTP 요청에 대한 타임아웃 설정하기

소개

aiohttp는 파이썬의 비동기 HTTP 클라이언트 라이브러리로, 많은 양의 동시 HTTP 요청을 처리하는 데 사용됩니다. 이 라이브러리를 사용하면 동시에 여러 개의 요청을 보낼 수 있지만, 때로는 각 요청에 대한 타임아웃을 설정해야 할 수도 있습니다. 이 글에서는 aiohttp를 사용하여 동시에 여러 개의 HTTP 요청에 대한 타임아웃을 설정하는 방법을 알아보겠습니다.

코드 예시

import asyncio
import aiohttp

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

async def main():
    urls = ['https://example.com', 'https://google.com', 'https://facebook.com']

    async with aiohttp.ClientSession() as session:
        tasks = []
        for url in urls:
            task = asyncio.create_task(fetch(session, url))
            tasks.append(task)

        # 타임아웃 설정
        timeout = aiohttp.ClientTimeout(total=10)
        results = await asyncio.wait_for(asyncio.gather(*tasks), timeout=timeout)

        for url, result in zip(urls, results):
            print(f'{url}: {result}')

asyncio.run(main())

위의 코드 예시에서는 fetch 함수를 정의하여 HTTP GET 요청을 보내고 응답을 반환하는 비동기 함수입니다. main 함수에서는 fetch 함수를 사용하여 urls 리스트에 있는 여러 개의 URL로 요청을 보내고, 각 요청에 대한 결과를 출력합니다.

ClientSession을 사용하여 aiohttp 세션을 만들고, 요청을 보낼 때 session.get을 사용합니다. session.get은 비동기적으로 실행되며, with 문을 사용하여 요청이 완료되면 response를 닫을 수 있습니다.

타임아웃을 설정하기 위해 ClientTimeout 객체를 생성하고, gather 함수를 사용하여 모든 태스크를 동시에 실행합니다. wait_for 함수를 사용하여 타임아웃을 적용하여 요청이 제한 시간 내에 완료되지 않으면 예외가 발생합니다.

결론

aiohttp를 사용하여 동시에 여러 개의 HTTP 요청에 대한 타임아웃을 설정하는 방법을 살펴보았습니다. 이를 통해 동시에 많은 양의 요청을 처리하는 서비스를 개발할 때 요청에 대한 제한 시간을 설정할 수 있습니다. aiohttp의 강력한 비동기 기능을 활용하여 효율적으로 HTTP 요청을 다룰 수 있습니다.

참고 자료