[python] aiohttp를 사용하여 동시에 여러 개의 HTTP 요청에 대한 에러 핸들링하기

이 블로그 포스트에서는 Python의 aiohttp 라이브러리를 사용하여 동시에 여러 개의 HTTP 요청을 처리하고, 이러한 요청에 대한 에러 핸들링을 어떻게 할 수 있는지에 대해 알아보겠습니다.

aiohttp 라이브러리란?

aiohttp는 Python에서 비동기 웹 요청 및 응답을 처리하기 위한 라이브러리입니다. 이 라이브러리를 사용하면 여러 개의 HTTP 요청을 동시에 보낼 수 있으며 비동기적으로 응답을 처리할 수 있습니다.

동시에 여러 개의 HTTP 요청 보내기

aiohttp를 사용하여 동시에 여러 개의 HTTP 요청을 보내려면 aiohttp.ClientSession 객체를 생성하고, client_session.get() 또는 client_session.post() 메서드를 사용하여 요청을 보낼 수 있습니다. 아래는 간단한 예제 코드입니다.

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:
        coroutines = [
            fetch(session, 'http://example.com'),
            fetch(session, 'http://google.com'),
            fetch(session, 'http://github.com'),
        ]
        responses = await asyncio.gather(*coroutines, return_exceptions=True)

        for response in responses:
            if isinstance(response, Exception):
                # 에러 핸들링
                print(f'Error occurred: {str(response)}')
            else:
                # 정상 응답 처리
                print(response)

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

위의 예제 코드에서는 세 개의 HTTP 요청을 보내고, asyncio.gather() 함수를 사용하여 모든 요청이 완료될 때까지 기다린 다음, 각각의 응답을 처리하고 에러를 핸들링합니다. return_exceptions=True 파라미터를 주어 응답이 에러인 경우에도 예외를 발생하지 않고 결과 목록에 포함시킵니다.

에러 핸들링하기

위의 예제 코드에서는 응답이 에러인 경우에 대해 간단하게 에러를 출력하는 방식으로 핸들링하였습니다. 여러분은 실제로 에러를 처리하는 로직을 구현할 수 있습니다. 예를 들어, 에러를 로그 파일에 기록하거나 다른 알림 처리를 할 수도 있습니다.

에러 핸들링의 다른 예제

import aiohttp
import asyncio

async def fetch(session, url):
    try:
        async with session.get(url) as response:
            return await response.text()
    except aiohttp.ClientError as e:
        # aiohttp.ClientError는 aiohttp에서 발생하는 모든 클라이언트 에러를 포함합니다.
        # 에러 처리를 위한 코드를 여기에 작성하세요.
        print(f'Client error occurred: {str(e)}')
    except Exception as e:
        # 그 외에 발생한 예외를 처리하기 위한 코드를 여기에 작성하세요.
        print(f'Error occurred: {str(e)}')

async def main():
    async with aiohttp.ClientSession() as session:
        coroutines = [
            fetch(session, 'http://example.com'),
            fetch(session, 'http://google.com'),
            fetch(session, 'http://github.com'),
        ]

        await asyncio.gather(*coroutines)

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

위의 예제 코드는 각각의 요청마다 try-except 구문을 사용하여 각각의 에러를 핸들링하는 방법을 보여줍니다. aiohttp.ClientError는 aiohttp에서 발생하는 모든 클라이언트 에러를 포함하는 기본 예외 클래스입니다.

결론

Python의 aiohttp 라이브러리를 사용하면 동시에 여러 개의 HTTP 요청을 보내고, 이러한 요청에 대한 에러 핸들링을 간단하게 수행할 수 있습니다. 위의 예제 코드를 참고하여 여러분만의 비동기 HTTP 요청 처리 및 에러 핸들링 로직을 구현해 보세요.

참고 자료