我正在try 编写一个迭代器,它在等待IO绑定任务的同时,继续进行迭代的下一步.大致演示我在代码中要做的事情
for i in iterable:
await io_bound_task() # move on to next step in iteration
# do more stuff when task is complete
我最初试着用一个简单的for
循环运行,用sleep
模拟一个IO绑定的任务
import asyncio
import random
async def main() -> None:
for i in range(3):
print(f"starting task {i}")
result = await io_bound_task(i)
print(f"finished task {result}")
async def io_bound_task(i: int) -> int:
await asyncio.sleep(random.random())
return i
asyncio.run(main())
在这里,代码同步运行并输出
starting task 0
finished task 0
starting task 1
finished task 1
starting task 2
finished task 2
我想这是因为for
循环阻塞了.所以我认为异步for
循环是继续的方式?所以我try 使用异步迭代器
from __future__ import annotations
import asyncio
import random
class AsyncIterator:
def __init__(self, max_value: int) -> None:
self.max_value = max_value
self.count = 0
def __aiter__(self) -> AsyncIterator:
return self
async def __anext__(self) -> int:
if self.count == self.max_value:
raise StopAsyncIteration
self.count += 1
return self.count
async def main() -> None:
async for i in AsyncIterator(3):
print(f"starting task {i}")
result = await io_bound_task(i)
print(f"finished task {result}")
async def io_bound_task(i: int) -> int:
await asyncio.sleep(random.random())
return i
asyncio.run(main())
但这似乎也是同步运行的,并导致输出
starting task 1
finished task 1
starting task 2
finished task 2
starting task 3
finished task 3
每一次.所以我认为异步迭代器没有做我认为它会做的事情?在这一点上,我被卡住了.我对异步迭代器的理解有问题吗?有人能给我一些建议,告诉我如何实现我的目标吗?
我刚接触async,所以如果我做了一些愚蠢的事情,我深表歉意.感谢您的帮助.谢谢
如果这是一个相关的细节,我是python 3.8.10
.