如何异步遍历一个范围

时间:2018-07-25 18:35:18

标签: python asynchronous python-3.6

在python3.6中,如果我想遍历一个范围,我可以简单地做到这一点

for i in range(100): pass

但是,如果要异步遍历某个范围,该怎么办?我做不到

async for i in range(100): pass # Doesn't work

因为range不是AsyncIterable对象。我可以考虑的一种解决方案是子类化范围并定义__aiter__方法。但是,对我来说,这真的不是pythonic。有没有什么好的方法/库可以无需定义自己的课程?

3 个答案:

答案 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)