Как создать асинхронный генератор в Python?
Я пытаюсь переписать этот код Python2.7 в новый асинхронный мировой порядок:
def get_api_results(func, iterable):
pool = multiprocessing.Pool(5)
for res in pool.map(func, iterable):
yield res
map()
блокирует, пока все результаты не будут вычислены, поэтому я пытаюсь переписать это как асинхронную реализацию, которая даст результаты, как только они будут готовы. подобноmap()
возвращаемые значения должны быть возвращены в том же порядке, что иiterable
, Я попробовал это (мне нужноrequests
из-за устаревших требований к аутентификации):
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)
но с Python 3.6 я получаю:
File "scratch.py", line 16, in <module>
for r in get_api_results():
TypeError: 'async_generator' object is not iterable
Как я могу сделать это?