Индикатор выполнения asyncio aiohttp с tqdm

Я пытаюсь интегрировать tqdm индикатор выполнения для отслеживания запросов POST, сгенерированных aiohttp в Python 3.5. У меня есть индикатор выполнения, но я не могу собирать результаты с помощью as_completed(). Указатели получены с благодарностью.

Примеры, которые я нашел, предлагают использовать следующий шаблон, который несовместим с определениями Python 3.5 async def:

for f in tqdm.tqdm(asyncio.as_completed(tasks), total=len(coros)):
    yield from f

Рабочий (хотя и отредактированный) асинхронный код без индикатора выполнения:

def async_classify(records):

    async def fetch(session, name, sequence):
        url = 'https://app.example.com/api/v0/search'
        payload = {'sequence': str(sequence)}
        async with session.post(url, data=payload) as response:
            return name, await response.json()

    async def loop():
        auth = aiohttp.BasicAuth(api_key)
        conn = aiohttp.TCPConnector(limit=100)
        with aiohttp.ClientSession(auth=auth, connector=conn) as session:
            tasks = [fetch(session, record.id, record.seq) for record in records]
            responses = await asyncio.gather(*tasks)    
        return OrderedDict(responses)

Это моя неудачная попытка изменить loop():

async def loop():
    auth = aiohttp.BasicAuth(api_key)
    conn = aiohttp.TCPConnector(limit=100)
    with aiohttp.ClientSession(auth=auth, connector=conn) as session:
        tasks = [fetch(session, record.id, record.seq) for record in records]
        for f in tqdm.tqdm(asyncio.as_completed(tasks), total=len(tasks)):
            await f
        responses = await asyncio.gather(f)
        print(responses)

person Bede Constantinides    schedule 18.06.2016    source источник


Ответы (1)


await f возвращает одиночный ответ. Почему вы передаете уже заполненный Future asyncio.gather(f), неясно.

Пытаться:

responses = []
for f in tqdm.tqdm(asyncio.as_completed(tasks), total=len(tasks)):
    responses.append(await f)

Python 3.6 реализует PEP 530 - асинхронное понимание:

responses = [await f
             for f in tqdm.tqdm(asyncio.as_completed(tasks), total=len(tasks))]

Теперь он работает внутри async def функций.

person jfs    schedule 18.06.2016
comment
@ j-f-sebastien Прекрасно! Спасибо, что дал мне знать - person Bede Constantinides; 07.11.2016