파이썬/기초 프로그래밍

파이썬 코루틴과 제너레이터 상태 & yield from 이해하기

Data Jun 2025. 9. 9. 10:26

파이썬에서 코루틴(coroutine)과 제너레이터(generator)는 실행을 멈추었다가 다시 이어갈 수 있다는 점에서 독특한 실행 흐름을 가집니다. 이를 이해하면 데이터 교환, 상태 보존, 비동기 처리 등 다양한 활용이 가능해집니다.

 

1. 제너레이터의 기본 동작

일반 함수는 한 번 실행이 끝나면 상태가 사라지지만, 제너레이터는 yield를 만나면 실행을 멈추고 값 반환 후에도 상태를 유지합니다.

def simple_gen():
    yield 1
    yield 2
    yield 3

g = simple_gen()
print(next(g))  # 1
print(next(g))  # 2
print(next(g))  # 3

 

2. 코루틴의 확장된 개념

코루틴은 제너레이터의 확장판으로, 단순히 값을 내보내는 것뿐만 아니라 값을 외부에서 받아들일 수도 있습니다.

def coroutine2(x):
    print('>>> coroutine stated.')
    y = yield x             # x를 반환하고 정지
    print('>>> received:', y)
    z = yield x + y         # (x+y)를 반환하고 정지
    print('>>> received:', z)

cr = coroutine2(10)
print(next(cr))     # >>> coroutine stated. 출력 후 10 반환
echo = cr.send(5)  # y=5 할당, 15 반환
cr.send(7)         # z=7 할당, 종료

실행 과정 요약

  1. next(cr) 호출 → x 반환, 상태 SUSPENDED
  2. cr.send(5) 호출 → y=5, x+y=15 반환
  3. cr.send(7) 호출 → z=7, 마지막 출력 후 종료 (CLOSED)

 

3. 제너레이터 상태 값

파이썬은 제너레이터와 코루틴이 어떤 상태인지 다음과 같이 구분합니다.

  • GEN_CREATED: 아직 시작하지 않음
  • GEN_RUNNING: 실행 중
  • GEN_SUSPENDED: yield에서 대기 중
  • GEN_CLOSED: 종료됨

이 상태를 알면, 현재 코드가 어디에서 멈추었는지 쉽게 이해할 수 있습니다.

 

4. yield from을 활용한 중첩 처리

여러 반복 객체를 제너레이터에서 연결하려면 반복문이 중첩될 수 있는데, 이를 간단히 만드는 문법이 yield from입니다.

def generator1():
    for x in 'AB':
        yield x
    for y in range(1, 4):
        yield y

print(list(generator1()))  # ['A', 'B', 1, 2, 3]


def generator2():
    yield from 'AB'
    yield from range(1, 4)

print(list(generator2()))  # ['A', 'B', 1, 2, 3]

yield from은 중첩된 루프를 간단히 표현하고, 제너레이터 위임을 직관적으로 만들 수 있는 도구입니다.

 

 

 

정리하면

  • 제너레이터: 값을 하나씩 생성하며 상태를 유지하는 함수.
  • 코루틴: 제너레이터를 확장해 값을 주고받으며 실행 흐름을 제어.
  • **상태 관리(GEN_CREATED, GEN_SUSPENDED 등)**로 실행 위치와 종료 여부를 파악할 수 있음.
  • **yield from**으로 중첩 반복을 간결하게 표현 가능.

코루틴은 단순한 반복자(generator)를 넘어, 비동기 프로그래밍의 기반이 되는 강력한 도구입니다.