파이썬에서 코루틴(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 할당, 종료
실행 과정 요약
- next(cr) 호출 → x 반환, 상태 SUSPENDED
- cr.send(5) 호출 → y=5, x+y=15 반환
- 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)를 넘어, 비동기 프로그래밍의 기반이 되는 강력한 도구입니다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| 파이썬 concurrent.futures에서 Future 객체의 Wait 다루기 (0) | 2025.09.09 |
|---|---|
| 파이썬 concurrent.futures를 이용한 병행 처리 간단 이해하기 (0) | 2025.09.09 |
| 파이썬 코루틴(제너레이터)로 메인↔서브 루틴 데이터 교환 이해하기 (0) | 2025.09.09 |
| 파이썬 이터레이터 vs 제너레이터 (0) | 2025.09.08 |
| 파이썬 이터레이터 예제: WordSplitIter (1) | 2025.09.08 |