Сейчас я использую асинхронная функция для обработки этих веб-страниц, каждый вызов принимает один адрес в качестве аргумента и возвращает плоский список строк. Я передаю эти URL-адреса сразу, мне нужен плоский список всех строк из каждого вызова функции, меня не волнует порядок этих строк, мне нужна строка, как только она будет получена, независимо от того, есть ли другие Вызовы функций завершены, и я не хочу объединять результаты.
Я просто не могу заставить это работать.
Это Минимальный воспроизводимый пример, иллюстрирующий то же самое проблема:
Код: Выделить всё
import asyncio
async def test(n):
await asyncio.sleep(0.5)
for i in range(1, 11):
yield n * i
async def run_test():
ls = []
for i in range(10):
async for j in test(i):
ls.append(j)
return ls
asyncio.run(run_test())
Я пробовал это:
Код: Выделить всё
async def run_test():
ls = []
for t in asyncio.as_completed([test(i) for i in range(10)]):
for i in await t:
ls.append(i)
return ls
Код: Выделить всё
TypeError: An asyncio.Future, a coroutine or an awaitable is required
Код: Выделить всё
import asyncio
async def test(n):
await asyncio.sleep(0.5)
for i in range(1, 11):
yield n * i
async def run_test():
ls = []
for x in await asyncio.gather(*(test(i) for i in range(10))):
for j in x:
ls.append(j)
return ls
asyncio.run(run_test())
Код: Выделить всё
TypeError: An asyncio.Future, a coroutine or an awaitable is required
Код: Выделить всё
import asyncio
async def test(n):
await asyncio.sleep(0.5)
return [n * i for i in range(1, 11)]
async def run_test():
ls = []
for x in asyncio.as_completed([test(i) for i in range(10)]):
ls.extend(await x)
return ls
asyncio.run(run_test())
Так как же я могу одновременно получать данные от асинхронных генераторов?
Подробнее здесь: https://stackoverflow.com/questions/793 ... chronously
Мобильная версия