Como criar um gerador assíncrono em Python?
Estou tentando reescrever esse código Python2.7 para a nova ordem mundial assíncrona:
def get_api_results(func, iterable):
pool = multiprocessing.Pool(5)
for res in pool.map(func, iterable):
yield res
map()
blocos até que todos os resultados tenham sido computados, então estou tentando reescrever isso como uma implementação assíncrona que produzirá resultados assim que estiverem prontos. Gostarmap()
, os valores de retorno devem ser retornados na mesma ordem queiterable
. Eu tentei isso (eu precisorequests
devido a requisitos de autenticação herdados):
import requests
def get(i):
r = requests.get('https://example.com/api/items/%s' % i)
return i, r.json()
async def get_api_results():
loop = asyncio.get_event_loop()
futures = []
for n in range(1, 11):
futures.append(loop.run_in_executor(None, get, n))
async for f in futures:
k, v = await f
yield k, v
for r in get_api_results():
print(r)
mas com o Python 3.6 eu estou recebendo:
File "scratch.py", line 16, in <module>
for r in get_api_results():
TypeError: 'async_generator' object is not iterable
Como posso fazer isso?