Как асинхронно сгладить кучу асинхронных генераторов?Python

Программы на Python
Ответить
Anonymous
 Как асинхронно сгладить кучу асинхронных генераторов?

Сообщение Anonymous »

Мне нужно парсить кучу веб-страниц, адреса этих веб-страниц отличаются только номером страницы, поэтому их можно обрабатывать параллельно с помощью aiohttp.
Сейчас я использую асинхронная функция для обработки этих веб-страниц, каждый вызов принимает один адрес в качестве аргумента и возвращает плоский список строк. Я передаю эти 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())
Приведенный выше код выполняется, но не дает ожидаемого результата. Он ждет 5 секунд вместо 0,5 секунды, и каждый раз, когда я запускаю его, результат один и тот же.
Я пробовал это:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»