프로그래밍 분야에서의 코루틴은 동시성 작업을 위한 기술입니다. Python에서도 코루틴을 구현할 수 있는데, 여기서의 코루틴은 generator와 꽤 유사합니다. Generator는 데이터의 생산자인데 반해, Coroutines은 데이터의 소비자입니다.

Python의 generator는 iterator를 생성하는 특별한 함수 객체로, yield 구문을 통해 필요할 때만 값을 반환합니다. Python 2.5에서 generator에 특별한 기능이 생겼는데, 바로 generator 속으로 값을 전달하는 기능입니다.(PEP 342 -- Coroutines via Enhanced Generators) 이는 두 generator가 번갈아 가면서 제어권을 넘기는 형태를 구성할 수 있게 됩니다.

Python 2.5에서 yield는 표현식이 되었습니다. 이전까지는 generator에서 값을 내놓는 지점을 설정하는 용도로 쓰였으나, 표현식이 되었다는 것은 '값으로 평가된다'는 말이 됩니다. 이를 통해 외부에서 generator로 값을 주입할 수 있고, yield는 재실행되는 시점에 입력값으로 평가됩니다. 이는 generator가 외부로부터 입력을 받는 함수(서브루틴)와 같이 동작할 수 있다는 것을 의미합니다.

generator 함수를 통해 코루틴을 생성했습니다. 생성 직후 코루틴의 실행 위치는 while True 이전에 멈춰 있습니다. next()를 한 번 호출하고 나면, s = (yield) 구문을 만나 멈추게 됩니다. 해당 표현식은 단순한 바인딩 구문이며, 따라서 우변이 평가되기 이전까지 코루틴이 멈춰 있습니다. Generator로 생성된 객체는 매직 메소드인 __next__()send() 메소드를 가집니다. 전자(__next__())는 next() 함수에 대응하여 다음번 yield 구문까지 실행하기 위한 메소드이며, 후자(send())는 코루틴 내부의 yield로 값을 밀어넣는 역할을 합니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

Argument Unpacking  (0) 2018.10.30
[Python] zip  (0) 2018.07.28
[Python] memoize  (0) 2018.07.26
[Python] Assert  (0) 2018.07.25
[Python] Generator  (0) 2018.07.23

+ Recent posts