반응형

이터레이터(Iterator)가 무엇인가?

파이썬을 사용하다보면은 흔히 만나는 예제가 있다

for i in range(0,10):
	print(i)

 

위와 같이 range 를 사용해서 값을 하나씩 가져다 오는 구문인데,

이는 파이썬 내부적으로 iterator를 만들어서 하나씩 호출하는 구조를 가진다

 

그렇기에 파이썬을 조금 더 파이썬 답게 사용하기 위해서는 이터레이터에 대해서 알아두면

간지가 조금 더 있어보일것이다 (pythonic하게)

 

 

 

 

이터레이터(Iterator)의 구조 

일단은 iterator (이터레이터)의 구조를 살펴보자

 

list1 = ["안녕","Hello","니하오"]

 

이러한 리스트가 있고,

 

for x in list1 :

    print(x)

 

이 리스타가 for문에서 어떻게 작동하냐면 내부적으로는 next(list1) 이라는 함수로 계속 다음번의 원소를 호출하는 구조를 가진다. 그리고 다음번 원소가 없을때에는 StopIteration이라는 예외가 발생하면서 for문이 종료를 시켜준다.

 

 

 

 

클래스로 이터레이터(Iterator) 만들기 

 

내가 직접 이터레이터를 만들기 위해서는 클래스로 구현을 하여야 한다

클래스에다 __init__()메서드 구현, __iter__() 메서드 구현, __next__()구현 을 하면 해당 클래스를 이터레이터로 사용을 할수가 있다

 

우리가 자주쓰는 Range 함수를 직접 클래스로 만들어서 사용을 해보자

아래와 같이 구현을 하게되면 Range를 사용하지 않아도 우리가 만든 MyRange 클래스로 사용이 가능하다

class MyRange():
    def __init__(self, begin, stop):
        self.current = begin
        self.stop = stop

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.stop:
            temp = self.current
            self.current += 1
            return temp
        else:
            raise StopIteration
        

for i in MyRange(1, 5):
    print(i, end=" ")

기존 클래스를 구현하는데에다

__iter__메서드와 __next__메서드를 추가적으로 구현한다고 생각하면 간단하다

반응형

'CS > 파이썬' 카테고리의 다른 글

파이썬 - async io 에 대해서 알아보자  (0) 2022.08.17
동시성과 병렬성에 관한 정리  (0) 2022.08.11
반응형

 

 

async io의 단어적 뜻은 Asynchronous IO 라는 단어적 뜻을 가지고 있다

동시성으로 여러개의  비동기 IO-Bound 작업들을 관리하는 것을 그 목적으로 가진다

 

AsyncIO를 사용하기 위해서는 기본적인 키워드 2개에 대해서 알고 있어야 한다

 

async, await 가 바로 그 두개의 키워디 인데,

 

함수 앞에 async 를 붙이게 되면, 해당 함수가 코루틴 객체로 바뀌면서 async io에서 사용이 가능하다

그리고 await 키워드는 뒤에 특정 작업 ( awaitable 속성을 가진 객체) 을 넣어주면 실행이 가능한 상황이다.

 

import asyncio

async def test_task():
    print("Hello World!")
    await asyncio.sleep(2)
    
    print("end")
    return "OKAY"
    


async def main():
    task1 = asyncio.create_task(test_task())
    task2 = asyncio.create_task(test_task())
    
    result = await asyncio.gather(task1, task2)


if __name__ == "__main__":
	await main()

 

 

 

 

async 키워드가 붙지 않는 함수에서도 asyncio를 사용하고 싶을 순간이 있을것이다.

그럴때는 쓰레드를 이용해서 asyncio를 구현을 하면 가능해진다

 

import asyncio
import time
import threading

lock = threading.Lock()


def block_task(task):
    with Lock:
        print(task, "Hello")
    
    time.sleep(1)
    
    with Lock:
        print(task,"World")
    return "OK"


async def main():
    loop = asyncio.get_running_loop()
    
    r1 = loop.run_in_executor(None, blocked_task, "Task1")
    r2 = loop.run_in_executor(None, blocked_task, "Task2")
    
    
    result = await asyncio.gather(r1,r2)
    
    print(result)


if __name__ =="__main__":
    await main()

 

 

 

일반적으로 파이썬에서 http 통신을 위해서는 request 패키지를 임포트해서 사용을 하는데, 이 패키지를 사용하면서 asyncio를 사용하기 위해서는 쓰레드를 위한 코드도 생성해야지 사용이 가능하다. 따라서 번거로움이 많아지는데,

aiohttp라는 패키지를 사용을 하면 번거로움이 사라진다.

 

 

반응형

'CS > 파이썬' 카테고리의 다른 글

파이썬 이터레이터 만들기 ( python iterator )  (0) 2022.09.01
동시성과 병렬성에 관한 정리  (0) 2022.08.11
반응형

 

반응형

 

파이썬을 사용하다보면은 성능에 대한 생각을 자주 하게된다. 느린 언어이지만 개발의 편의성 때문에 파이썬을 버릴수도 없기에 계속 사용을 하게 되는 뫼비우스의 띠를 직접 몸으로 겪는다. 이에 대한 여러가지 나름의 해결책들이 있기에 그것들에 대한 정리의 필요성을 느끼게 되었다.

 

동시성과 병렬성이라는 단어의 뜻부터 알아보자.

 

동시성이라는 것은 여러개의 일들을 동시에 진행되는 것처럼 하는 것이다. 예를들어 우리가 한꺼번에 일을 처리를 하는것을 들수가 있다. n잡러들에게는 여러개의 일을 같이 진행을 하는데, 이것이 현실상의 동시성을 얘기를 하는것이라고 생각이 든다. 프로그래밍에서는 io-bound의 문제들을 일컫는다.

 

 

병렬성이라는 것은 동시성과는 다르게 하나일을 여러가지 코어가 나누어서 집중적으로 진행한다는 것이다. 하나의 큰 작업 ( ex: 고시공부) 를 공부할때에, 오전에는 A과목을, 오후에는 B과목을.. 등등 하나의 큰 목표를 위해 그 작업을 잘게 쪼개서 진행을 한다.  이것을 병렬성이라고 생각할수 있음. 프로그래밍에서는 cpu-bound의 문제를 말한다.

 

문제 예시 전략 멀티쓰레딩 멀티프로세싱 Asyncio
 IO-BOUND 이미지 다운로드 동시성 O O
CPU-BOUND 행렬계산 병렬성 X(GIL) O X

 

 

여기서 잠깐 동기식(synchronous)과 비동기식(asynchronous)라는 단어도 자주 나오는데, 개념을 알고가야지 해당부분에 대한 헷갈림이 덜해진다

비동기식은 : 완전히 독립적으로 진행이 되고, 대기하지 않아도 되는 작업들을 말한다.

동기식은 서로 데이터들을 주기적으로 모아주고, 공유하는 작업을 진행을 할때에 말한다.

 

동시성이나 병렬성을 구현을 할때에 비동기식과 동기식으로 둘다 구현이 가능하지만, 당연히 비동기식으로 구현하는게 효율이 더 좋다. 하지만 풀려는 문제에 따라서 알고리즘을 동기식으로 구현을 해야할수도 있다는 것을 알아두어야 한다.

 

결국에는 단어가 가지고 있는 뜻이 헷갈려서 어렵다고 생각을 하는 것인데,

다음의 단어의 뜻을 정확히 알고 있으면 해결이 된다

 

1) 동기식 vs 비동기식 (synchronous vs asynchronous)

2) IO-BOUND vs CPU-BOUND

3) 동시성 vs 병렬성

4) 멀티쓰레딩 vs 멀티프로세싱 vs Async io

 

 

 

반응형

+ Recent posts