Python3 线程还是 aiohttp?
Python3 threads or aiohttp?
我想创建一个程序,可以获取 100 个网页和 return 它们的内容。我现在可以用一个简单的 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()
我想创建一个程序,可以获取 100 个网页和 return 它们的内容。我现在可以用一个简单的 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()