Python/Utils

파이썬 requests 비동기로 요청하기(aiohttp 및 asyncio 활용)

jimmy_AI 2023. 9. 16. 23:45
반응형

Python에서 requests 모듈로 get, post 등의 요청을 진행하는 경우가 종종 있는데요.

이번 글에서는 이러한 종류의 요청을 aiohttp 모듈을 통하여 async로 처리하는 방법을

간략하게 정리해보도록 하겠습니다.

 

 

일반적인 requests 사용 방법 예시

먼저, 일반적으로 GET 메소드를 requests 모듈로 실행하는 방법은

대략적으로 아래 코드처럼 정리가 가능합니다.

import requests

response = requests.get('요청 url')

if response.status_code == 200: # 요청 성공
    print('결과:', response.text)
else: # 요청 실패
    print('실패 상태 코드:', response.status_code)

 

POST 메소드도 마찬가지로 다음 코드 스니펫처럼 사용을 하게됩니다.

import requests

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('요청 url', data=data)

if response.status_code == 200: # 요청 성공
    print('결과:', response.text)
else: # 요청 실패
    print('실패 상태 코드:', response.status_code)

이제 위의 예시에서의 GET, POST 메소드 사용 과정에서 비동기 처리를

진행해보도록 하겠습니다.

 

반응형

 

aiohttp를 활용한 async requests 방법

우선, aiohttp 모듈이 설치되지 않았다면 !pip install aiohttp 명령어를 통하여

모듈 설치를 먼저 진행해야 합니다.

 

위의 GET 메소드 예시를 비동기 처리로 변환한 예제는 다음과 같습니다.

import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status == 200: # 요청 성공
                print('결과:', await response.text()) # await 주의
            else: # 요청 실패
                print('실패 상태 코드:', response.status)

if __name__ == '__main__':
    asyncio.run(fetch('요청 url'))

비동기 함수 내에서 선언해서 사용한 점에 유의해주시고,

결과를 가져오는 과정에서 await가 필요한 점도 눈여겨 보시면 좋습니다.

 

또한, 만일 fetch 함수를 다른 비동기 함수 내에서 호출할 경우에도 앞에 await를 붙여서

await fetch(url) 형태로 호출해주셔야 합니다.

 

POST 메소드 예시도 마찬가지로 비동기 처리로 변환한 예제를 살펴보면서

이 글을 마무리해보도록 하겠습니다.

import aiohttp
import asyncio

async def fetch(url, data):
    async with aiohttp.ClientSession() as session:
        async with session.post(url, data=data) as response:
            if response.status == 200: # 요청 성공
                print('결과:', await response.text()) # await 주의
            else: # 요청 실패
                print('실패 상태 코드:', response.status)

if __name__ == '__main__':
    data = {'key1': 'value1', 'key2': 'value2'}
    asyncio.run(fetch('요청 url', data))