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()