본문 바로가기
파이썬

[Python] Generator, Coroutine에 대해

by 김수호님 2018. 11. 22.
728x90
반응형

제너레이터와 코루틴


코루틴은 6~70년대에 만들어진 기술이지만 이후 동시성 작업을 위한 새로운 기술들(쓰레드 등)이

등장하면서 거의 방치되다가 쓰레드가 야기하는 문제 때문에 새롭게 주목받고있다.

이는 주 실행 흐름과는 독립적으로 운용가능한

함수가 존재한다는 뜻이며, 별도의 쓰레드 없이 메인 쓰레드상에서 번갈아가며 병렬처리와 유사한 동작을 수행할 수 있기 때문이다.

 하지만 이런 특수한 상황이 아니더라도 제너레이터 혹은 코루틴은 파이썬 프로그래밍에서 매우 중요한 비중을 차지한다. 

많은 경우에 제너레이터는 간단한 클래스를 대체할 수 있으며, 

단위 작업을 제너레이터로 만들어서 일련의 작업에 대한 파이프라인을 구성하는 식으로 프로그램을 작성할 수 있다.



제너레이터


-yield를 사용하여 함수 흐름이 종료되지 않고 중단된다. 제너레이터 함수를 호출하면 제너레이터 객체가 생성된다. 제너레이터 객체는

생성된 후에 바로 동작을 수행하지 않는다. 대신에 외부로부터 동작을 요청받으면 그때부터 실행된다. 제너레이터 객체에 값을 요청하는 함수는 next()이다. 이 함수로

넘겨진 제너레이터는 yield문을 만날 때까지 실행된 후 다시 멈추게 된다.(실행흐름은 next()를 호출한 쪽으로 돌아감)


yield


-이전까지 yield란 제너레이터가 어떤 루프 속에서 잠시 멈추면서 값을 내놓는 지점을 설정하는 용도였다. 하지만 파이썬 2.5부터 yield는 표현식의 기능을 더하게 되었다.

 즉, 대입문의 우변이 될수 있다는 말이며, 값으로 평가된다는 것이다. 이는 외부에서 제너레이터로 어떤 값을 주입할 수 있고, yield는 재실행되는 시점에 입력값으로 평가된다.

이는 제너레이터가 단순히 일방적으로 정해진 규칙에 따라 값을 만들어내기 보다는 외부로부터 입력을 받는 함수(서브루틴)과 같이 동작할 수 있게 되었다는 것이다.

->값을 입력받을 수 있는 제너레이터: 코루틴


Coroutine


-generator에다가 값을 받을 수 있도록 동작한다. 작성한 코루틴을 사용하기 위해 먼저 next함수를 호출해 yield로 위치를 옮겨두어야 한다. 그 다음 send로 값을 전송해서 코루틴을 실행시키면 된다.



정리


-코루틴은 함수 여러개(수천,수만)를 동시에 실행하듯이 동작하게 할 수 있다.

-제너레이터 yield는 외부에서 send메서드로 보낸 값이다.

-어떤 때에 써먹을 수 있는지 더 고민해봐야겠다.

728x90
반응형