Rumah > pembangunan bahagian belakang > Tutorial Python > Permintaan HTTP Asynchronous dalam Python dengan HTTPX dan asyncio

Permintaan HTTP Asynchronous dalam Python dengan HTTPX dan asyncio

Mary-Kate Olsen
Lepaskan: 2025-01-11 07:25:42
asal
467 orang telah melayarinya

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.

Apakah Kod Tidak Menyekat?

Istilah seperti "tak segerak", "tidak menyekat" dan "serentak" boleh mengelirukan. Pada asasnya:

  • Rutin tak segerak boleh "jeda" sementara menunggu keputusan, membenarkan rutin lain dilaksanakan serentak.
  • Ini mewujudkan penampilan pelaksanaan serentak, walaupun keselarian sebenar mungkin tidak terlibat.

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.

Persediaan

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>
Salin selepas log masuk

Membuat Permintaan HTTP dengan HTTPX

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>
Salin selepas log masuk

async menandakan coroutine; await menghasilkan kawalan kepada gelung acara, meneruskan pelaksanaan apabila ketersediaan keputusan.

Membuat Berbilang Permintaan

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>
Salin selepas log masuk

Masakan pelaksanaan. Bandingkan ini dengan pendekatan segerak.

Perbandingan Permintaan 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>
Salin selepas log masuk

Perhatikan perbezaan masa jalan. Pengumpulan sambungan HTTPX meminimumkan jurang perbezaan, tetapi asyncio menawarkan pengoptimuman lanjut.

Teknik Asynchronous Terperinci

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>
Salin selepas log masuk

Ini mengurangkan masa pelaksanaan dengan ketara dengan menjalankan permintaan secara serentak. Jumlah masa menghampiri tempoh permintaan tunggal terpanjang.

Kesimpulan

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. Asynchronous HTTP Requests in Python with HTTPX and asyncio Asynchronous HTTP Requests in Python with HTTPX and asyncio Asynchronous HTTP Requests in Python with HTTPX and asyncio

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan