Я имею в виду, что я получу от использования async для. Вот код, который я пишу с использованием async, 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 для, если я хочу перебрать несколько объектов Feature и использовать их, как только один из них будет завершен. Например:
async for f in feature_objects:
data = await f
with open("file", "w") as fi:
fi.write()
Подробнее здесь: https://stackoverflow.com/questions/561 ... -in-python