深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

2024 桐庐半程马拉松
00:00:00
时间
0.00
距离(公里)
--:--
配速
--
步频
--
心率 (bpm)
--
配速
步频
|
share-image
ESC

Python 高并发编程:深入理解 asyncio 与 aiohttp

在 Python 3.4 引入 asyncio 标准库后,Python 终于有了原生的异步 I/O 支持。而 aiohttp 则是基于 asyncio 构建的异步 HTTP 客户端/服务端框架。

对于高并发爬虫或高吞吐量的 Web 服务来说,requests 这种同步阻塞库往往是性能瓶颈所在。使用 aiohttp,我们可以轻松实现单线程下的成千上万次并发请求。

异步编程核心概念

在开始之前,我们需要理解两个关键字:

  • async def: 定义一个协程函数(Coroutine)。
  • await: 挂起当前协程,等待一个耗时操作(如网络请求)完成,期间释放 CPU 给其他协程使用。

aiohttp 客户端实战

假设我们需要并发抓取 10 个网页:

import aiohttp
import asyncio
import time

async def fetch(session, url):
async with session.get(url) as response:
return await response.text()

async def main():
urls = [f'http://httpbin.org/get?id={i}' for i in range(10)]

# 创建一个 ClientSession,建议在整个生命周期中复用
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
# 创建任务
task = asyncio.create_task(fetch(session, url))
tasks.append(task)

# 等待所有任务完成
results = await asyncio.gather(*tasks)

for res in results:
print(f"Got response length: {len(res)}")

if __name__ == '__main__':
start = time.time()
# 运行 Event Loop
asyncio.run(main())
print(f"Cost: {time.time() - start:.2f} seconds")

代码解析

  1. ClientSession: 它是连接池的管理器,不要为每个请求都创建一个 Session,那样效率极低。
  2. asyncio.gather: 并发运行多个协程,并收集结果。

与 Requests 的对比

特性 Requests aiohttp
I/O 模型 同步阻塞 (Blocking) 异步非阻塞 (Non-blocking)
并发能力 依赖多线程/多进程,开销大 单线程高并发,开销小
适用场景 简单脚本,低频请求 高并发爬虫,微服务
上手难度 中(需理解 async/await)

总结

aiohttp 是 Python 异步生态中最重要的基石之一。虽然写起来比 requests 稍微繁琐一些,但在处理大量网络 I/O 时,它带来的性能提升是数量级的。如果你正在开发需要处理高并发网络请求的应用,aiohttp 是你的不二之选。

文章作者:阿文
文章链接: https://www.awen.me/post/226f0353.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客
本文于 2021-02-28 11:20 发布,已超过半年(1841天),请注意甄别内容是否已过期。

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
您的评论由 AI 智能审核,一般1分钟内会展示,若不展示请确认你的评论是否符合社区和法律规范
加载中...

选择联系方式

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️