python - Python3 线程还是 aiohttp?
问题描述
我想创建一个可以获取 100 个网页并返回其内容的程序。我现在可以用一个简单的 python 脚本来做到这一点:
import requests
urls = [...]
data = []
for url in urls:
content = requests.get(url).content
data.append(content)
但是,上述实现的缺点是,在 for 循环中,必须在对下一个 url 发出请求之前加载内容。我想要做的是避免这种情况。我想为每个 url 发出一个请求,但不必等待加载当前 url 的内容完成。我怎样才能做到这一点?我已经阅读了 aiohttp 和线程,但我不确定什么是最好的方法。
解决方案
asyncio + aiohttp是一个很好的组合,可以显着提高性能:
示例实现:
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
resp = await session.get(url)
content = await resp.text()
return content
async def main():
urls = [...]
webpages = await asyncio.gather(*[fetch(url) for url in urls])
# use webpages for further processing
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
推荐阅读
- jquery - 如何使用 jQuery 获取 td 标签中输入标签的值
- php - 如何在 plesk centos7 上安装 ffmpeg php 扩展
- c# - c# BeginReceive 回调
- javascript - AXIOS:如何同时运行http请求并在请求失败时获取所有请求事件的结果
- cygwin - 为什么 cygwin 安装会创建不同的 `bin/cyg*.dll` 文件?
- jquery - 如何使自定义滑块以编程方式切换图片
- javascript - 使用 lightGallery 和 Jekyll:TypeError: $(...).lightGallery is not a function
- javascript - $.each 在函数未定义(没有作品)
- r - 传单永远加载,永远不会在 RStudio 中显示
- amazon-web-services - Amazon EMR 使用 Spot 实例作为核心,使用 Terraform 的主节点