web-dev-qa-db-ja.com

asyncioaiohttpプログレスバーとtqdm

tqdmプログレスバーを統合してPOST aiohttpで生成されたリクエストをPython 3.5で監視しようとしています。Iプログレスバーが機能しているが、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)
_
15

_await f_はsingle応答を返します。すでに完了したFutureasyncio.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_関数内で機能します。

22
jfs