Plango 프로젝트에서는 TourAPI의 5개 API를 비동기로 호출한다!
searchKeyword1detailCommon1detailIntro1detailInfo1detailImage1따라서 나는 5개의 async def 함수를 만들고, 그 안에서 각 API를 호출할 때는 requests 라이브러리를 사용할 생각이었다.
하지만 개발을 진행하면서, 비동기 함수 내부에서 requests를 사용하는 것은 실제로 비동기적으로 작동하지 않는다는 점을 알게 되었다.
비동기 처리를 하려면 requests가 아닌, httpx.AsyncClient와 같은 비동기 지원 라이브러리를 사용해야 한다는 사실을 알게 되었다.
따라서 나는 httpx.AsyncClient에 대해서 공부해 보았다!
HTTPX라이브러리는 동기 및 비동기 요청 모두를 지원하여 개발자가 더욱 효율적으로 네트워크 작업을 수행할 수 있도록 돕습니다.
httpx.get()은 요청을 보내고 응답이 올 때까지 기다린다. 여러 요청을 동시에 처리해야 할 때는 비효율적이다!await client.get(...)는 요청을 보내고, 그동안 다른 작업을 할 수 있도록 양보한다. 여러 요청을 동시에 보낼 수 있어 속도 향상 가능하다!A:
결론부터 말하면 async def 안에서 requests 라이브러리를 사용하더라도 비동기 HTTP 요청은 할 수 없습니다.
async def는 단지 "비동기 함수"를 정의할 뿐이다!async def my_func():
# 이 안에서 동기 함수도 호출 가능
print("hello")
async def는 이 함수는 비동기적으로 실행될 수 있다는 뜻일 뿐,async def 함수 내부에서 await 가능한 비동기 함수를 사용해야만, 해당 코드가 I/O 대기 중 다른 작업으로 넘어가는 진짜 비동기 처리가 가능하다!await 없이 동기 함수를 쓰면 그 함수가 응답을 받을 때까지 계속 기다리기만 하므로, 비동기 함수 안에 있더라도 실제로는 비동기적으로 동작하지 않게 됩니다. 따라서 형식만 async def가 아니라, 내부에 await 가능한 작업을 써야 진짜 비동기 코드가 되는거죠!await 뒤에는 반드시 awaitable 객체, 즉 비동기 함수(코루틴) 가 있어야 한다.requests는 비동기 I/O를 지원하지 않음import requests
async def fetch():
response = requests.get("https://www.example.com") # ❌ 동기 방식
print(response.text)
requests.get()은 완전히 동기적인 함수입니다.async def 안에서 써도 비동기적으로 작동하지 않습니다.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할 수 있습니다.