Python aiohttp 全面指南:異步HTTP客戶端/服務器框架

邊寫代碼零食不停口 盼盼麥香雞味塊 、卡樂比(Calbee)薯條三兄弟 獨立小包、好時kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸

邊寫代碼邊貼面膜 事業美麗兩不誤 DR. YS 野森博士+【AOUFSE/澳芙雪特證】377專研美白淡斑面膜組合 優惠劵

別光顧寫代碼更要多喝茶水,提神有營養 六安瓜片茶葉茶香二級200g 2025年新茶雨前盒裝自己喝

讓AI成為我們的得力助手:《用Cursor玩轉AI輔助編程——不寫代碼也能做軟件開發》

Python 圖書推薦

書名出版社推薦
Python編程 從入門到實踐 第3版(圖靈出品)人民郵電出版社★★★★★
Python數據科學手冊(第2版)(圖靈出品)人民郵電出版社★★★★★
圖形引擎開發入門:基于Python語言電子工業出版社★★★★★
科研論文配圖繪制指南 基于Python(異步圖書出品)人民郵電出版社★★★★★
Effective Python:編寫好Python的90個有效方法(第2版 英文版)人民郵電出版社★★★★★
Python人工智能與機器學習(套裝全5冊)清華大學出版社★★★★★

JAVA 圖書推薦

書名出版社推薦
Java核心技術 第12版:卷Ⅰ+卷Ⅱ機械工業出版社★★★★★
Java核心技術 第11版 套裝共2冊機械工業出版社★★★★★
Java語言程序設計基礎篇+進階篇 原書第12版 套裝共2冊機械工業出版社★★★★★
Java 11官方參考手冊(第11版)清華大學出版社★★★★★
Offer來了:Java面試核心知識點精講(第2版)(博文視點出品)電子工業出版社★★★★★

什么是 aiohttp?

aiohttp 是一個基于 Python asyncio 的異步 HTTP 客戶端/服務器框架,專為高性能網絡編程設計。它提供了:

  1. 異步 HTTP 客戶端(類似異步版 requests)
  2. 異步 HTTP 服務器(類似異步版 Flask/Django)
  3. 完整的 WebSocket 支持
  4. 高效的連接池管理

核心優勢

特性描述
異步非阻塞單線程處理數千并發連接
高性能遠超同步框架(如 requests)的吞吐量
輕量級簡潔的API,無復雜依賴
全面協議支持HTTP/1.1, HTTP/2(客戶端), WebSocket
生態完善良好文檔和活躍社區

基礎用法 - HTTP客戶端

安裝

pip install aiohttp

基本GET請求

import aiohttp
import asyncioasync def main():async with aiohttp.ClientSession() as session:async with session.get('https://api.example.com/data') as response:print("狀態碼:", response.status)print("響應內容:", await response.text())asyncio.run(main())

POST請求示例

async def post_example():async with aiohttp.ClientSession() as session:# 表單數據async with session.post('https://httpbin.org/post', data={'key': 'value'}) as response:print(await response.json())# JSON數據async with session.post('https://api.example.com/users',json={'name': 'Alice', 'age': 30}) as response:print(await response.json())

高級用法

并發請求

async def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def concurrent_requests():urls = ['https://api.example.com/item/1','https://api.example.com/item/2','https://api.example.com/item/3']tasks = [fetch(url) for url in urls]results = await asyncio.gather(*tasks)for url, content in zip(urls, results):print(f"{url}: {content[:50]}...")asyncio.run(concurrent_requests())

超時控制

async def timeout_example():timeout = aiohttp.ClientTimeout(total=5)  # 5秒總超時async with aiohttp.ClientSession(timeout=timeout) as session:try:async with session.get('https://slow-api.example.com') as response:return await response.text()except asyncio.TimeoutError:print("請求超時!")

流式處理大響應

async def stream_response():async with aiohttp.ClientSession() as session:async with session.get('https://large-file.example.com') as response:with open('large_file.txt', 'wb') as f:async for chunk in response.content.iter_chunked(1024):f.write(chunk)print(f"已接收 {len(chunk)} 字節")

服務器端開發

基本HTTP服務器

from aiohttp import webasync def handle(request):name = request.match_info.get('name', "World")return web.Response(text=f"Hello, {name}!")app = web.Application()
app.add_routes([web.get('/', handle),web.get('/{name}', handle)
])if __name__ == '__main__':web.run_app(app, port=8080)

REST API示例

async def get_users(request):users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]return web.json_response(users)async def create_user(request):data = await request.json()# 實際應用中這里會保存到數據庫return web.json_response({'id': 3, **data}, status=201)app = web.Application()
app.add_routes([web.get('/api/users', get_users),web.post('/api/users', create_user)
])

WebSocket服務器

async def websocket_handler(request):ws = web.WebSocketResponse()await ws.prepare(request)async for msg in ws:if msg.type == aiohttp.WSMsgType.TEXT:if msg.data == 'close':await ws.close()else:await ws.send_str(f"ECHO: {msg.data}")elif msg.type == aiohttp.WSMsgType.ERROR:print('WebSocket連接異常關閉')return wsapp.add_routes([web.get('/ws', websocket_handler)])

進階擴展

中間件示例

async def auth_middleware(app, handler):async def middleware(request):# 驗證API密鑰if request.headers.get('X-API-Key') != 'SECRET_KEY':return web.json_response({'error': 'Unauthorized'}, status=401)return await handler(request)return middlewareapp = web.Application(middlewares=[auth_middleware])

HTTP/2客戶端支持

async def http2_request():conn = aiohttp.TCPConnector(force_close=True, enable_cleanup_closed=True)async with aiohttp.ClientSession(connector=conn) as session:async with session.get('https://http2.akamai.com/',headers={'accept': 'text/html'}) as response:print("HTTP版本:", response.version)print("內容:", await response.text()[:200])

性能優化配置

# 自定義連接器配置
connector = aiohttp.TCPConnector(limit=100,  # 最大并發連接數limit_per_host=20,  # 單主機最大連接數ssl=False,  # 禁用SSL驗證(僅用于測試)force_close=True  # 避免連接延遲關閉
)# 自定義會話配置
session = aiohttp.ClientSession(connector=connector,timeout=aiohttp.ClientTimeout(total=30),headers={'User-Agent': 'MyApp/1.0'},cookie_jar=aiohttp.CookieJar(unsafe=True)
)

最佳實踐

  1. 重用ClientSession:避免為每個請求創建新會話
  2. 使用連接池:合理配置TCPConnector參數
  3. 超時設置:總是配置合理的超時時間
  4. 資源清理:使用async with確保資源釋放
  5. 錯誤處理:捕獲并處理常見網絡異常
    try:async with session.get(url) as response:response.raise_for_status()return await response.json()
    except aiohttp.ClientError as e:print(f"請求錯誤: {e}")
    

完整示例

import aiohttp
import asyncio
from aiohttp import web# 客戶端示例
async def fetch_data():async with aiohttp.ClientSession() as session:# 并發請求多個APIurls = ['https://jsonplaceholder.typicode.com/posts/1','https://jsonplaceholder.typicode.com/comments/1','https://jsonplaceholder.typicode.com/albums/1']tasks = []for url in urls:tasks.append(session.get(url))responses = await asyncio.gather(*tasks)results = []for response in responses:results.append(await response.json())return results# 服務器示例
async def handle_index(request):return web.Response(text="Welcome to aiohttp server!")async def handle_api(request):data = await fetch_data()return web.json_response(data)# 創建應用
app = web.Application()
app.add_routes([web.get('/', handle_index),web.get('/api', handle_api)
])# 啟動服務器
async def start_server():runner = web.AppRunner(app)await runner.setup()site = web.TCPSite(runner, 'localhost', 8080)await site.start()print("Server running at http://localhost:8080")# 保持運行while True:await asyncio.sleep(3600)  # 每小時喚醒一次if __name__ == '__main__':asyncio.run(start_server())

總結

aiohttp 是 Python 異步生態中處理 HTTP 通信的首選工具,它提供了:

  1. 高效客戶端:用于高性能爬蟲、API調用
  2. 輕量級服務器:構建高性能Web服務和API
  3. WebSocket支持:實現實時雙向通信
  4. 連接池管理:優化資源利用率

通過合理利用 aiohttp 的異步特性,開發者可以輕松構建出能夠處理數萬并發連接的高性能網絡應用,同時保持代碼的簡潔性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83408.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83408.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83408.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

歸并排序:高效穩定的分治算法

歸并排序 歸并排序采用分治策略實現穩定排序&#xff0c;其核心思想是將序列遞歸分解后進行有序合并。 def merge_sort(arr):if len(arr) < 1:return arrmid len(arr) // 2left merge_sort(arr[:mid])right merge_sort(arr[mid:])result []i j 0while i < len(le…

go語言基礎|slice入門

slice slice介紹 slice中文叫切片&#xff0c;是go官方提供的一個可變數組&#xff0c;是一個輕量級的數據結構&#xff0c;功能上和c的vector&#xff0c;Java的ArrayList差不多。 slice和數組是有一些區別的&#xff0c;是為了彌補數組的一些不足而誕生的數據結構。最大的…

網絡攻防技術九:網絡監聽技術

文章目錄 一、網絡監聽概述二、網絡流量劫持三、數據采集與解析四、網絡監聽檢測與防范1、檢測實施監聽主機2、防范網絡通信被監聽 一、網絡監聽概述 主要解決問題&#xff1a;網絡流量劫持、在監聽點上采集并分析網絡數據。主要涉及網卡數據采集、協議分析技術。 二、網絡流量…

Cat.1與Cat.4區別及應用場景

Cat.1 和 Cat.4 都是 LTE&#xff08;4G&#xff09;網絡中的終端設備類別&#xff0c;主要區別在于 數據傳輸速率、復雜度和功耗&#xff0c;這直接影響了它們的應用場景和成本。 以下是它們的主要區別&#xff1a; 數據傳輸速率 (核心區別)&#xff1a; Cat.1 (Category 1)&…

【后端高階面經:架構篇】51、搜索引擎架構與排序算法:面試關鍵知識點全解析

一、搜索引擎核心基石&#xff1a;倒排索引技術深度解析 &#xff08;一&#xff09;倒排索引的本質與構建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎實現快速檢索的核心數據結構&#xff0c;與傳統數據庫的正向索引&#xff08;文檔→關鍵詞&#xff0…

深度學習入門:從零搭建你的第一個神經網絡

深度學習入門&#xff1a;從零搭建你的第一個神經網絡 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 深度學習入門&#xff1a;從零搭建你的第一個神經網絡摘要引言第一章&#xff1a;神經網絡基礎原理1.1 神經元…

Hadoop 3.x 偽分布式 8088端口無法訪問問題處理

【Hadoop】YARN ResourceManager 啟動后 8088 端口無法訪問問題排查與解決(偽分布式啟動Hadoop) 在配置和啟動 Hadoop YARN 模塊時&#xff0c;發現雖然 ResourceManager 正常啟動&#xff0c;JPS 進程中也顯示無誤&#xff0c;但通過瀏覽器訪問 http://主機IP:8088 時卻無法打…

docker B站學習

鏡像是一個只讀的模板&#xff0c;用來創建容器 容器是docker的運行實例&#xff0c;提供了獨立可移植的環境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目錄掛載 尚硅谷doc…

鴻蒙OSUniApp微服務架構實踐:從設計到鴻蒙部署#三方框架 #Uniapp

UniApp微服務架構實踐&#xff1a;從設計到鴻蒙部署 引言 在最近的一個大型跨平臺項目中&#xff0c;我們面臨著一個有趣的挑戰&#xff1a;如何在UniApp框架下構建一個可擴展的微服務架構&#xff0c;并確保其在包括鴻蒙在內的多個操作系統上流暢運行。本文將分享我們的實踐…

Freemarker快速入門

Freemarker概述 FreeMarker 是一款 模板引擎&#xff1a; 即一種基于模板和要改變的數據&#xff0c; 并用來生成輸出文本(HTML網頁&#xff0c;電子郵件&#xff0c;配置文件&#xff0c;源代碼等)的通用工具。 它不是面向最終用戶的&#xff0c;而是一個Java類庫&#xff0c…

操作系統:生態思政

操作系統&#xff1a;生態思政 操作系統&#xff08;OS&#xff09;作為數字世界的基石&#xff0c;其意義遠超單純的技術平臺。它構建了一個包含開發者、用戶、硬件廠商在內的復雜生態系統&#xff0c;其設計理念、運行規則與生態治理模式&#xff0c;無不深刻映射著特定的價…

二進制安全-OpenWrt-uBus

1 需求 需求&#xff1a;ubus list 需求&#xff1a;ubus -v list 需求&#xff1a;ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …

Rust 學習筆記:自定義構建和發布配置

Rust 學習筆記&#xff1a;自定義構建和發布配置 Rust 學習筆記&#xff1a;自定義構建和發布配置發布配置文件自定義 profile 的選項 Rust 學習筆記&#xff1a;自定義構建和發布配置 發布配置文件 在 Rust 中&#xff0c;發布配置文件是預定義的和可定制的概要文件&#xf…

優化 Transformer 模型:基于知識蒸餾、量化技術及 ONNX

Transformer 模型非常強大&#xff0c;但往往太大太慢&#xff0c;不適合實時應用。為了解決這個問題&#xff0c;我們來看看三種關鍵的優化技術&#xff1a;知識蒸餾、量化和ONNX 圖優化。這些技術可以顯著減少推理時間和內存使用。 為了說明每種技術的利弊&#xff0c;我們以…

Vue3中Axios的使用-附完整代碼

前言 首先介紹一下什么是axios Axios 是一個基于 promise 網絡請求庫&#xff0c;作用于node.js 和瀏覽器中。 它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。在服務端它使用原生 node.js http 模塊, 而在客戶端 (瀏覽端) 則使用 XMLHttpRequests 官方網站…

@Pushgateway自定義腳本推送數據

文章目錄 Pushgateway 自定義腳本推送數據1. 目的2. 適用范圍3. 前提條件4. 操作流程4.1 確定指標類型和格式4.2 編寫推送腳本方法一:使用 curl 命令行推送方法二:使用 Python 腳本推送方法三:使用 Python 客戶端庫推送4.3 設置定時任務4.4 驗證數據5. 高級配置5.1 使用基本…

Git 使用規范指南

Learn Git Branching 1Git 基礎使用流程 1.1初始化與克隆 # 初始化本地倉庫 git init# 克隆遠程倉庫 git clone <repo_url> 一般拉取代碼&#xff0c;直接在文件夾界面打開bash&#xff0c;git clone就行了 1.2日常開發流程 1拉取最新代碼 git pull origin <branc…

設計模式——備忘錄設計模式(行為型)

摘要 備忘錄設計模式是一種行為型設計模式&#xff0c;用于在不破壞封裝性的前提下&#xff0c;捕獲對象的內部狀態并在需要時恢復。它包含三個關鍵角色&#xff1a;原發器&#xff08;Originator&#xff09;、備忘錄&#xff08;Memento&#xff09;和負責人&#xff08;Car…

動態規劃十大經典題型狀態轉移、模版等整理(包括leetcode、洛谷題號)

動態規劃十大經典題目整理 0-1 背包問題&#xff08;0-1 Knapsack Problem&#xff09; LeetCode題號&#xff1a;無直接對應洛谷OJ題號&#xff1a;P1048狀態轉移方程&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i])C代碼模板&#xff1a; int dp[capacity 1…

簡單transformer運用

通俗易懂解讀&#xff1a;hw04.py 文件內容與 Transformer 的應用 這個文件是一個 Python 腳本&#xff08;hw04.py&#xff09;&#xff0c;用于完成 NTU 2021 Spring 機器學習課程的 HW4 作業任務&#xff1a;揚聲器分類&#xff08;Speaker Classification&#xff09;。它…