Почему мой асинхронный генератор зависает и срабатывает только один раз после ожидания?Python

Программы на Python
Anonymous
 Почему мой асинхронный генератор зависает и срабатывает только один раз после ожидания?

Сообщение Anonymous »

У меня есть асинхронный генератор на Python, который должен получать данные порциями. Идея состоит в том, чтобы дождаться некоторых данных, получить их и затем повторить. Просто, правда?
Но вот в чем интерес: он дает только один раз, а затем все просто зависает. Никаких ошибок, ничего. Он просто останавливается.
Вот упрощенная версия моего кода:

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

import asyncio

async def fetch_data_chunk():
# Simulate some async operation to get a chunk of data
print("Fetching data...")
await asyncio.sleep(1) # Pretend this is a network call
data = [1, 2, 3] # Sample data
print("Data fetched.")
return data

async def data_generator():
print("Generator started.")
while True:
chunk = await fetch_data_chunk()
if not chunk:
print("No more chunks.")
break
print(f"Yielding chunk: {chunk}")
yield chunk
print("Yielded. Looping again...")
await asyncio.sleep(0.1) # Small pause to see if it helps, it doesn't

async def main():
print("Main starting.")
gen = data_generator()
try:
async for item in gen:
print(f"Received item from generator: {item}")
# Simulate processing the item
await asyncio.sleep(0.5)
except StopAsyncIteration:
print("Generator finished iteration.")
print("Main finished.")

if __name__ == "__main__":
asyncio.run(main())
Ожидаемый результат:

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

Main starting.
Generator started.
Fetching data...
Data fetched.
Yielding chunk: [1, 2, 3]
Received item from generator: [1, 2, 3]
Yielded. Looping again...
Fetching data...
Data fetched.
Yielding chunk: [1, 2, 3]
Received item from generator: [1, 2, 3]
Yielded. Looping again...
... (and so on) ...
Фактический результат:

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

Main starting.
Generator started.
Fetching data...
Data fetched.
Yielding chunk: [1, 2, 3]
Received item from generator: [1, 2, 3]
Yielded. Looping again...
А потом просто зависает. «Извлечение данных...» никогда не печатается второй раз. Это похоже на то, как цикл while в data_generator просто останавливается после первого выхода.
Я пробовал кучу вещей:
  • Удаление await asyncio.sleep(0.1) в генераторе.
  • Изменение while True на for _ in range(3) (то же самое поведение, просто останавливается после 1).
  • Воздействие с основной функцией await asyncio.sleep.
Мне кажется, что мне не хватает чего-то очень простого в том, как await и выход работают вместе в асинхронных генераторах. Что я здесь делаю не так?

Подробнее здесь: https://stackoverflow.com/questions/798 ... fter-await

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