비동기 프로그래밍은 Python 개발에서 점점 더 중요해지고 있습니다. 이제 asyncio
가 표준 라이브러리 구성 요소와 호환되는 많은 타사 패키지로 인해 이 패러다임은 그대로 유지됩니다. 이 튜토리얼에서는 비차단 코드의 주요 사용 사례인 비동기 HTTP 요청에 HTTPX
라이브러리를 사용하는 방법을 보여줍니다.
'비동기', '비차단', '동시'와 같은 용어는 혼란스러울 수 있습니다. 기본적으로:
비동기 코드는 차단을 방지하므로 결과를 기다리는 동안 다른 코드가 실행될 수 있습니다. asyncio
라이브러리는 이를 위한 도구를 제공하고 aiohttp
는 특수한 HTTP 요청 기능을 제공합니다. HTTP 요청은 다른 작업이 효율적으로 실행될 수 있는 기간인 서버 응답을 기다려야 하기 때문에 비동기성에 이상적입니다.
Python 환경이 구성되어 있는지 확인하세요. 필요한 경우 가상 환경 가이드를 참고하세요(Python 3.7 필요). HTTPX
설치:
<code class="language-bash">pip install httpx==0.18.2</code>
이 예에서는 Pokémon API에 대한 단일 GET 요청을 사용하여 Mew(Pokémon #151)에 대한 데이터를 가져옵니다.
<code class="language-python">import asyncio import httpx async def main(): url = 'https://pokeapi.co/api/v2/pokemon/151' async with httpx.AsyncClient() as client: response = await client.get(url) pokemon = response.json() print(pokemon['name']) asyncio.run(main())</code>
async
은 코루틴을 지정합니다. await
이벤트 루프에 제어권을 넘겨주고 결과가 나오면 실행을 재개합니다.
비동시성의 진정한 힘은 수많은 요청을 할 때 분명하게 드러납니다. 이 예에서는 처음 150마리의 포켓몬에 대한 데이터를 가져옵니다.
<code class="language-python">import asyncio import httpx import time start_time = time.time() async def main(): async with httpx.AsyncClient() as client: for number in range(1, 151): url = f'https://pokeapi.co/api/v2/pokemon/{number}' response = await client.get(url) pokemon = response.json() print(pokemon['name']) asyncio.run(main()) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
실행 시간을 정하세요. 이를 동기식 접근 방식과 비교해 보세요.
동기식 동일:
<code class="language-python">import httpx import time start_time = time.time() client = httpx.Client() for number in range(1, 151): url = f'https://pokeapi.co/api/v2/pokemon/{number}' response = client.get(url) pokemon = response.json() print(pokemon['name']) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
런타임 차이에 유의하세요. HTTPX
의 연결 풀링은 격차를 최소화하지만 asyncio는 더욱 최적화를 제공합니다.
우수한 성능을 얻으려면 asyncio.ensure_future
및 asyncio.gather
을 사용하여 요청을 동시에 실행하세요.
<code class="language-python">import asyncio import httpx import time start_time = time.time() async def fetch_pokemon(client, url): response = await client.get(url) return response.json()['name'] async def main(): async with httpx.AsyncClient() as client: tasks = [asyncio.ensure_future(fetch_pokemon(client, f'https://pokeapi.co/api/v2/pokemon/{number}')) for number in range(1, 151)] pokemon_names = await asyncio.gather(*tasks) for name in pokemon_names: print(name) asyncio.run(main()) print(f"--- {time.time() - start_time:.2f} seconds ---")</code>
요청을 동시에 실행하여 실행 시간을 크게 단축합니다. 총 시간은 가장 긴 단일 요청의 기간에 가깝습니다.
HTTPX
및 비동기 프로그래밍을 사용하면 여러 HTTP 요청의 성능이 크게 향상됩니다. 이 튜토리얼은 asyncio
에 대한 기본 소개를 제공합니다. Python 프로젝트를 향상시키기 위해 그 기능을 더욱 자세히 살펴보십시오. 대체 비동기 HTTP 요청 처리를 위해 aiohttp
을 살펴보세요.
위 내용은 HTTPX 및 asyncio를 사용하는 Python의 비동기 HTTP 요청의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!