async def 안에서 requests 쓰면 HTTP 요청이 비동기적으로 안된다고⁉️ (httpx.AsyncClient)

seongmin0302·2025년 5월 13일
0

plango 프로젝트

목록 보기
9/10

Plango 프로젝트에서는 TourAPI의 5개 API를 비동기로 호출한다!

  • searchKeyword1
  • detailCommon1
  • detailIntro1
  • detailInfo1
  • detailImage1

따라서 나는 5개의 async def 함수를 만들고, 그 안에서 각 API를 호출할 때는 requests 라이브러리를 사용할 생각이었다.

하지만 개발을 진행하면서, 비동기 함수 내부에서 requests를 사용하는 것은 실제로 비동기적으로 작동하지 않는다는 점을 알게 되었다.

비동기 처리를 하려면 requests가 아닌, httpx.AsyncClient와 같은 비동기 지원 라이브러리를 사용해야 한다는 사실을 알게 되었다.

따라서 나는 httpx.AsyncClient에 대해서 공부해 보았다!


HTTPX라이브러리는 동기 및 비동기 요청 모두를 지원하여 개발자가 더욱 효율적으로 네트워크 작업을 수행할 수 있도록 돕습니다.

  • httpx.get()은 요청을 보내고 응답이 올 때까지 기다린다. 여러 요청을 동시에 처리해야 할 때는 비효율적이다!
  • await client.get(...)는 요청을 보내고, 그동안 다른 작업을 할 수 있도록 양보한다. 여러 요청을 동시에 보낼 수 있어 속도 향상 가능하다!

Q. async def 안에서 requests를 쓰면 HTTP 요청이 비동기적으로 되는거 아냐?

A:
결론부터 말하면 async def 안에서 requests 라이브러리를 사용하더라도 비동기 HTTP 요청은 할 수 없습니다.


1. async def는 단지 "비동기 함수"를 정의할 뿐이다!

async def my_func():
    # 이 안에서 동기 함수도 호출 가능
    print("hello")
  • async def는 이 함수는 비동기적으로 실행될 수 있다는 뜻일 뿐,
    내부에서 사용하는 코드가 전부 비동기 코드라는 보장은 없습니다.
  • async def 함수 내부에서 await 가능한 비동기 함수를 사용해야만, 해당 코드가 I/O 대기 중 다른 작업으로 넘어가는 진짜 비동기 처리가 가능하다!
  • 즉, await 없이 동기 함수를 쓰면 그 함수가 응답을 받을 때까지 계속 기다리기만 하므로, 비동기 함수 안에 있더라도 실제로는 비동기적으로 동작하지 않게 됩니다. 따라서 형식만 async def가 아니라, 내부에 await 가능한 작업을 써야 진짜 비동기 코드가 되는거죠!
  • 참고로 모든 함수가 await 가능한 건 아니다!
    await 뒤에는 반드시 awaitable 객체, 즉 비동기 함수(코루틴) 가 있어야 한다.

2. requests는 비동기 I/O를 지원하지 않음

import requests

async def fetch():
    response = requests.get("https://www.example.com")  # ❌ 동기 방식
    print(response.text)
  • requests.get()완전히 동기적인 함수입니다.
  • 이 함수는 CPU를 점유하고 블로킹(blocking) 합니다.
    즉, 응답이 올 때까지 다른 작업은 중단됩니다.
  • 따라서 async def 안에서 써도 비동기적으로 작동하지 않습니다.

3. 진짜 비동기 HTTP 요청을 하려면?

조건: await 가능한 비동기 함수를 써야 합니다.

import httpx

async def fetch():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://www.example.com")  # ✅ 비동기 요청
        print(response.text)
  • httpx.AsyncClient.get()비동기 함수이므로 await할 수 있습니다.
  • 이때 Python은 네트워크 응답을 기다리는 동안 다른 작업을 병렬로 처리할 수 있습니다.
profile
컴튜터공학과 재학중

0개의 댓글