def simple_coroutine():
print('-> coroutine started')
x = yield
print('-> coroutine received:',x)
my_coro = simple_coroutine()
my_coro
next(my_coro)
my_coro.send(42)
코루틴이 갖는 4가지 상태로 inspect.getgeneratorstate() 함수를 이용해서 현재 상태를 알 수 있다.
GEN_CREATED
실행을 시작하기 위해 대기하고 있는 상태
GEN_RUNNING
현재 인터프리터가 실행하고 있는 상태
GEN_SUSPENDED
현재 yield 문에서 대기하고 있는 상태
GEN_CLOSED
실행이 완료된 상태
send() 메서드에 전달한 인수가 대기하고 있는 yield 표현식의 값이 되므로, 코루틴이 현재 대기 상태에 있을 경우 my_coro.send(42)와 같은 형태로만 호출할 수 있지만 코루틴이 아직 기동되지 않은 상태인 경우에는 send() 메서드를 호출할 수 없으므로 코루틴을 처음 활성화하기 위해 next(my_coro)를 호출한다.
my_coro =simple_coroutine()
my_coro.send(1729)
처음 next(my_coro)를 호출할 때, 코루틴을 기동한다고 표현하므로 코루틴이 호출자로부터 값을 받을 수 있도록 처음 나오는 yield문까지 실행 진행한다.
def simple_coro2(a):
print('-> Started: a=', a)
b = yield a
print('-> Received: b=', b)
c = yield a + b
print('-> Received: c=',c)
my_coro2 = simple_coro2(14)
from inspect import getgeneratorstate
getgeneratorstate(my_coro2)
코루틴 실행은 yield 키워드에서 중단됨을 잘 알고 있고, 할당문에서 실제 값을 할당하기 전에 = 오른쪽 코드를 실행하고, b=yield a와 같은 코드에서는 나중에 호출자가 값을 보낸 후에야 변수 b가 설정된다.