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