在python3.6中,如果我想遍历一个范围,我可以简单地做到这一点
for i in range(100): pass
但是,如果要异步遍历某个范围,该怎么办?我做不到
async for i in range(100): pass # Doesn't work
因为range
不是AsyncIterable
对象。我可以考虑的一种解决方案是子类化范围并定义__aiter__
方法。但是,对我来说,这真的不是pythonic。有没有什么好的方法/库可以无需定义自己的课程?
答案 0 :(得分:1)
这应该做到:
async def myrange(start, stop=None, step=1):
if stop:
range_ = range(start, stop, step)
else:
range_ = range(start)
for i in range_:
yield i
await asyncio.sleep(0)
答案 1 :(得分:1)
定义:
<script>
System.import("@test/root-config")
</script>
使用:
class asyncrange:
class __asyncrange:
def __init__(self, *args):
self.__iter_range = iter(range(*args))
async def __anext__(self):
try:
return next(self.__iter_range)
except StopIteration as e:
raise StopAsyncIteration(str(e))
def __init__(self, *args):
self.__args = args
def __aiter__(self):
return self.__asyncrange(*self.__args)
结果:
async for i in asyncrange(100, 10, -10):
print(i)
答案 2 :(得分:0)
https://www.python.org/dev/peps/pep-0525/#asynchronous-generator-object
可以代替range()的示例函数:
async def arange(count):
for i in range(count):
yield(i)