Я имею в виду, что я получу от использования async for
. Вот код, который я пишу с async for
, AIter(10)
можно заменить на get_range()
.
Но код работает как синхронизация, а не асинхронность.
import asyncio
async def get_range():
for i in range(10):
print(f"start {i}")
await asyncio.sleep(1)
print(f"end {i}")
yield i
class AIter:
def __init__(self, N):
self.i = 0
self.N = N
def __aiter__(self):
return self
async def __anext__(self):
i = self.i
print(f"start {i}")
await asyncio.sleep(1)
print(f"end {i}")
if i >= self.N:
raise StopAsyncIteration
self.i += 1
return i
async def main():
async for p in AIter(10):
print(f"finally {p}")
if __name__ == "__main__":
asyncio.run(main())
Результат, который я исключил, должен быть:
start 1
start 2
start 3
...
end 1
end 2
...
finally 1
finally 2
...
Однако реальный результат:
start 0
end 0
finally 0
start 1
end 1
finally 1
start 2
end 2
Я знаю, что могу получить ожидаемый результат, используя asyncio.gather
или asyncio.wait
.
Но мне трудно понять, что я получил, используя async for
здесь вместо простого for
.
Как правильно использовать async for
, если я хочу перебрать несколько объектов Feature
и использовать их, как только один из них будет завершен. Например:
async for f in feature_objects:
data = await f
with open("file", "w") as fi:
fi.write()