2016-06-18 23 views
5

Próbuję zintegrować pasek postępu tqdm, aby monitorować żądania POST wygenerowane za pomocą aiohttp w Pythonie 3.5. Mam działający pasek postępu, ale nie mogę zebrać wyników przy użyciu as_completed(). Wskaźniki z wdzięcznością przyjmowane.Pasek postępu asyncio aiohttp z tqdm

Przykłady znalazłem sugerują, stosując następujący wzór, który jest niezgodny z Pythonem 3.5 async def definicje:

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

pracy (choć w części) redacted kod asynchroniczny bez paska postępu:

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) 

to moja nieudana próba modyfikacji 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) 

Odpowiedz

10

await f zwraca pojedynczą odpowiedź . Dlaczego przekazanie już zakończonego Future do asyncio.gather(f) jest niejasne.

Spróbuj:

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

Python 3.6 narzędzia PEP 530 -- Asynchronous Comprehensions:

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

To działa wewnątrz async def funkcje teraz.

+0

Dziękuję bardzo:) –

+0

@ j-f-sebastien Lovely! Dzięki, że dałeś mi znać –