Цель программы:
получать данные из URL (a, b, c, ...) одновременно и обрабатывать данные одновременно.
ПредполагаяЧтение данных представляет собой массив от 0 до 10 Json. Вывод может выглядеть следующим образом: *
a 0
a 1
b 0
b 1
c 0
b 2
a 2
..
a 10
c 8
c 9
b 10
c 10
done
, что означает, что каждый URL анализируется отдельно (одновременно), и внутренний цикл FOR выполняется независимо от URL.
Проблема:
процесс данных выглядит линейным, вывод равен
a 0
a 1
a 2
..
a 10
b 0
b 1
b ..
b 10
c 0
..
c 10
done
Я борюсь с этой асинхронной подпрограммой.Где моя вина?Как я могу сделать это правильно?
Код: (не совсем то же самое, выполнение кода, конечно, приводит к ошибке)
import json
import asyncio
import aiohttp
urls = []
async def getResource(link):
try:
async with aiohttp.ClientSession() as s:
async with s.get(link, timeout=5) as r:
t = await r.text()
return t
except Exception as ex:
return ''
async def getBatchData(url):
try:
t = await getResource(url)
if t != '':
tree = json.loads(t)
for d in tree:
print("url=", url, " data=", d.text)
print('done')
except Exception as ex:
print(ex)
async def getDone():
sem = asyncio.Semaphore(10)
async with sem:
futures2 = [asyncio.ensure_future(getBatchData(url)) for url in urls]
await asyncio.gather(*futures2)
urls = ['a', 'b', 'c']
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.ensure_future(getDone()))
loop.close()
Спасибо.