Pengaturcaraan tak segerak semakin penting dalam pembangunan Python. Dengan asyncio
kini komponen perpustakaan standard dan banyak pakej pihak ketiga yang serasi, paradigma ini akan kekal. Tutorial ini menunjukkan penggunaan pustaka HTTPX
untuk permintaan HTTP tak segerak—kes penggunaan utama untuk kod tidak menyekat.
Istilah seperti "tak segerak", "tidak menyekat" dan "serentak" boleh mengelirukan. Pada asasnya:
Kod tak segerak mengelak daripada menyekat, membolehkan kod lain dijalankan sementara menunggu keputusan. Pustaka asyncio
menyediakan alatan untuk ini dan aiohttp
menawarkan fungsi permintaan HTTP khusus. Permintaan HTTP sesuai untuk ketidaksegerakan kerana ia melibatkan menunggu respons pelayan, tempoh di mana tugas lain boleh dilaksanakan dengan cekap.
Pastikan persekitaran Python anda dikonfigurasikan. Rujuk kepada panduan persekitaran maya jika perlu (Python 3.7 diperlukan). Pasang HTTPX
:
<code class="language-bash">pip install httpx==0.18.2</code>
Contoh ini menggunakan satu permintaan GET ke API Pokémon untuk mengambil data untuk 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
menandakan coroutine; await
menghasilkan kawalan kepada gelung acara, meneruskan pelaksanaan apabila ketersediaan keputusan.
Kuasa sebenar ketidaksegerakan terbukti apabila membuat banyak permintaan. Contoh ini mengambil data untuk 150 Pokémon pertama:
<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>
Masakan pelaksanaan. Bandingkan ini dengan pendekatan segerak.
Persamaan segerak:
<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>
Perhatikan perbezaan masa jalan. Pengumpulan sambungan HTTPX
meminimumkan jurang perbezaan, tetapi asyncio menawarkan pengoptimuman lanjut.
Untuk prestasi unggul, jalankan permintaan serentak menggunakan asyncio.ensure_future
dan 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>
Ini mengurangkan masa pelaksanaan dengan ketara dengan menjalankan permintaan secara serentak. Jumlah masa menghampiri tempoh permintaan tunggal terpanjang.
Menggunakan HTTPX
dan pengaturcaraan tak segerak meningkatkan prestasi secara dramatik untuk berbilang permintaan HTTP. Tutorial ini menyediakan pengenalan asas kepada asyncio
; terokai lagi keupayaannya untuk mempertingkatkan projek Python anda. Pertimbangkan untuk meneroka aiohttp
untuk pengendalian permintaan HTTP tak segerak alternatif.
Atas ialah kandungan terperinci Permintaan HTTP Asynchronous dalam Python dengan HTTPX dan asyncio. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!