Skip to content

Python:For

python, for, async for 사용법.

async for

async for로 동작하는 클래스를 만들려면 __aiter____anext__ 메서드를 구현해야 합니다 (asynchronous iter, asynchronous next라는 뜻). 그리고 메서드를 만들 때는 반드시 async def를 사용합니다.

async for는 파이썬 3.5 이상부터 사용 가능.

Example

다음은 1초마다 숫자를 생성하는 비동기 이터레이터입니다:

import asyncio

class AsyncCounter:
    def __init__(self, stop):
        self.current = 0
        self.stop = stop

    def __aiter__(self):
        return self

    async def __anext__(self):
        if self.current < self.stop:
            await asyncio.sleep(1.0)
            r = self.current
            self.current += 1
            return r
        else:
            raise StopAsyncIteration

async def main():
    async for i in AsyncCounter(3):    # for 앞에 async를 붙임
        print(i, end=' ')

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

제너레이터 방식

yield를 사용하여 제너레이터 방식으로 비동기 이터레이터를 만들 수도 있습니다. 다음과 같이 async def로 네이티브 코루틴을 만들고 yield를 사용하여 값을 바깥으로 전달하면 됩니다.

파이썬 3.6 이상부터 사용 가능.

import asyncio

async def async_counter(stop):    # 제너레이터 방식으로 만들기
    n = 0
    while n < stop:
        yield n
        n += 1
        await asyncio.sleep(1.0)

async def main():
    async for i in async_counter(3):    # for 앞에 async를 붙임
        print(i, end=' ')

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

한줄로 사용법

async def main():
    a = [i async for i in AsyncCounter(3)]
    print(a)    # [0, 1, 2]

See also