프로그래밍 분야에서의 코루틴은 동시성 작업을 위한 기술입니다. 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 |