Получение нескольких URL-адресов с aiohttp в Python 3.5
так как Python 3.5 представил async with
синтаксис, рекомендованный в docs на aiohttp
изменилось. Теперь, чтобы получить один url, они предлагают:
import aiohttp
import asyncio
async def fetch(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
return await response.text()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
with aiohttp.ClientSession(loop=loop) as session:
html = loop.run_until_complete(
fetch(session, 'http://python.org'))
print(html)
как я могу изменить это, чтобы получить коллекцию URL-адресов вместо одного url-адреса?
старого asyncio
примеры вы бы создали список задач, таких как
tasks = [
fetch(session, 'http://cnn.com'),
fetch(session, 'http://google.com'),
fetch(session, 'http://twitter.com')
]
Я попытался объединить такой список с подходом выше, но не удалось.
1 ответов
для параллельного выполнения требуется ввода-вывода.Задача
я преобразовал ваш пример в параллельную выборку данных из нескольких источников:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
if response.status != 200:
response.raise_for_status()
return await response.text()
async def fetch_all(session, urls, loop):
results = await asyncio.gather(*[loop.create_task(fetch(session, url))
for url in urls])
return results
async def main():
urls = ['http://cnn.com',
'http://google.com',
'http://twitter.com']
async with aiohttp.ClientSession(loop=loop) as session:
htmls = await fetch_all(session, urls, loop)
print(htmls)
if __name__ == '__main__':
asyncio.run(main())