코루틴으로 사용되는 제너레이터의 기본 동작

매일 공부(ML)·2023년 4월 25일
0

Fluent Python

목록 보기
114/130

제어 흐름

코루틴

코루틴으로 사용되는 제너레이터의 기본 동작

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가 설정된다.

profile
성장을 도울 아카이빙 블로그

0개의 댓글