非同步程式設計在 Python 開發中變得越來越重要。 隨著 asyncio
現在成為標準庫元件和許多相容的第三方包,這種範例將繼續存在。本教學課程示範如何使用 HTTPX
程式庫進行非同步 HTTP 請求 - 非阻塞程式碼的主要用例。
什麼是非阻塞程式碼?
「非同步」、「非阻塞」和「並發」等術語可能會令人困惑。 本質上:
- 非同步例程可以在等待結果時“暫停”,從而允許其他例程同時執行。
- 這會創建並發執行的外觀,即使可能不涉及真正的並行性。
非同步程式碼避免阻塞,使其他程式碼能夠在等待結果時運作。 asyncio
函式庫為此提供了工具,並且 aiohttp
提供了專門的 HTTP 請求功能。 HTTP 請求非常適合非同步性,因為它們涉及等待伺服器回應,在此期間其他任務可以有效執行。
設定
確保您的 Python 環境已配置。 如果需要,請參閱虛擬環境指南(需要 Python 3.7)。 安裝HTTPX
:
pip install httpx==0.18.2
使用 HTTPX 發出 HTTP 請求
此範例使用對 Pokémon API 的單一 GET 請求來取得 Mew(Pokémon #151)的資料:
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())
async
指定一個協程; await
產生對事件循環的控制,在結果可用時恢復執行。
提出多個請求
當發出大量請求時,非同步性的真正力量是顯而易見的。此範例取得前 150 個 Pokémon 的資料:
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 ---")
執行的時間。 將此與同步方法進行比較。
同步請求比較
同步等效項:
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 ---")
注意運行時差異。 HTTPX
的連接池最大限度地減少了差異,但 asyncio 提供了進一步的最佳化。
高階非同步技術
為了獲得卓越的效能,請使用 asyncio.ensure_future
和 asyncio.gather
同時執行請求:
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 ---")
這透過並發運行請求顯著減少了執行時間。 總時間接近最長單次請求的持續時間。
結論
使用 HTTPX
和非同步程式設計可以顯著提高多個 HTTP 請求的效能。本教學提供了 asyncio
的基本介紹;進一步探索其功能以增強您的 Python 專案。 考慮探索 aiohttp
來取代非同步 HTTP 請求處理。
以上是Python 中使用 HTTPX 和 asyncio 的非同步 HTTP 請求的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本教程演示如何使用Python處理Zipf定律這一統計概念,並展示Python在處理該定律時讀取和排序大型文本文件的效率。 您可能想知道Zipf分佈這個術語是什麼意思。要理解這個術語,我們首先需要定義Zipf定律。別擔心,我會盡量簡化說明。 Zipf定律 Zipf定律簡單來說就是:在一個大型自然語言語料庫中,最頻繁出現的詞的出現頻率大約是第二頻繁詞的兩倍,是第三頻繁詞的三倍,是第四頻繁詞的四倍,以此類推。 讓我們來看一個例子。如果您查看美國英語的Brown語料庫,您會注意到最頻繁出現的詞是“th

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

處理嘈雜的圖像是一個常見的問題,尤其是手機或低分辨率攝像頭照片。 本教程使用OpenCV探索Python中的圖像過濾技術來解決此問題。 圖像過濾:功能強大的工具圖像過濾器

PDF 文件因其跨平台兼容性而廣受歡迎,內容和佈局在不同操作系統、閱讀設備和軟件上保持一致。然而,與 Python 處理純文本文件不同,PDF 文件是二進製文件,結構更複雜,包含字體、顏色和圖像等元素。 幸運的是,借助 Python 的外部模塊,處理 PDF 文件並非難事。本文將使用 PyPDF2 模塊演示如何打開 PDF 文件、打印頁面和提取文本。關於 PDF 文件的創建和編輯,請參考我的另一篇教程。 準備工作 核心在於使用外部模塊 PyPDF2。首先,使用 pip 安裝它: pip 是 P

本教程演示瞭如何利用Redis緩存以提高Python應用程序的性能,特別是在Django框架內。 我們將介紹REDIS安裝,Django配置和性能比較,以突出顯示BENE

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

Python是數據科學和處理的最愛,為高性能計算提供了豐富的生態系統。但是,Python中的並行編程提出了獨特的挑戰。本教程探討了這些挑戰,重點是全球解釋

本教程演示了在Python 3中創建自定義管道數據結構,利用類和操作員超載以增強功能。 管道的靈活性在於它能夠將一系列函數應用於數據集的能力,GE


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

Atom編輯器mac版下載
最受歡迎的的開源編輯器