首页 > 解决方案 > 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 和线程,但我不确定什么是最好的方法。

标签: pythonmultithreadingasynchronouspython-requestsaiohttp

解决方案


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()

推荐阅读