asyncio и aiohttp для одновременного получения данных в Python3 - PullRequest
0 голосов
/ 28 ноября 2018

Цель программы:

получать данные из 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()

Спасибо.

...