CodeGym /ํ–‰๋™ /Python SELF KO /๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์™€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ

Python SELF KO
๋ ˆ๋ฒจ 26 , ๋ ˆ์Šจ 3
์‚ฌ์šฉ ๊ฐ€๋Šฅ

10.1 AsyncIterator

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ (AsyncIterator)๋Š” ์š”์†Œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฐ์ดํ„ฐ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ์ฝ”๋ฃจํ‹ด์—์„œ, ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด๋‚˜ ๋น„๋™๊ธฐ I/O ์ž‘์—… ๋“ฑ์—์„œ ์ง€์—ฐ๋˜์–ด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•  ๋•Œ ์‚ฌ์šฉํ•ด.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ด:

๋ฉ”์„œ๋“œ __aiter__():

์ด ๋ฉ”์„œ๋“œ๋Š” ์ž์ฒด ๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ด. ๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ __iter__() ๋ฉ”์„œ๋“œ์™€ ๋น„์Šทํ•ด.

๋ฉ”์„œ๋“œ __anext__():

์ด ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ๊ฐ’์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์š”์†Œ๊ฐ€ ๋๋‚˜๋ฉด StopAsyncIteration ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•ด. ๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ์˜ __next__() ๋ฉ”์„œ๋“œ์™€ ๋น„์Šทํ•ด.

์˜ˆ์ œ:


import asyncio

class AsyncIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end
        
    def __aiter__(self):
        return self
        
    async def __anext__(self)(self):
        if self.current >= self.end:
            raise StopAsyncIteration
        
        await asyncio.sleep(1)  # ๋น„๋™๊ธฐ ์ง€์—ฐ์„ ๋ชจ๋ฐฉ
        self.current += 1
        return self.current
        
async def main():
    async for number in AsyncIterator(1, 5):
        print(number)
        
asyncio.run(main())

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•˜๋Š” ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์„œ ๋‹ค๋ฅธ ์ž‘์—…์˜ ์‹คํ–‰์„ ๋ง‰์ง€ ์•Š์•„. ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด๋‚˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ž‘์—…์— ํŠนํžˆ ์œ ์šฉํ•ด.

๋น„๋™๊ธฐ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์–ด.

10.2 AsyncGenerator

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” async์™€ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด. ์ผ๋ฐ˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์„ ์ผ์‹œ ์ค‘๋‹จํ•  ์ˆ˜ ์žˆ์–ด.

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” async def์™€ yield๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜๋ผ. ๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์—์„œ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

์˜ˆ์ œ:


async def async_generator():
    for i in range(3):
        await asyncio.sleep(1)  # ๋น„๋™๊ธฐ ์ง€์—ฐ
        yield i  # ๊ฐ’ ์ƒ์„ฑ

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” async for ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ๋ผ.


import asyncio

async def main():
    async for value in async_generator():
        print(value)
            
asyncio.run(main())

๋น„๋™๊ธฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” async for๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ ์‹œํ€€์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์„œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ.

์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION