Python/파이썬 심화

코루틴 (2)

monstro 2025. 10. 12. 19:59
728x90
반응형

- 개요

코루틴과 관련된 예제를 진행하여 코루틴에 대해서 더 자세하게 알아본다

 

1) 코루틴의 상태

코루틴의 처리 상황에 따라서 코루틴의 상태를 확인할 수 있다

각각 다음과 같이 구성되어 있다

  • GEN_CREATED : 최초 대기 상태
  • GEN_RUNNING : 실행 상태
  • GEN_SUSPENDED : yield 대기 상태
  • GEN_CLOSED : 실행 완료 상태

 

코루틴의 상태는 inspect 모듈의 getgeneratorstate 함수를 호출하여 확인할 수 있다

 

def cor2(x):
    print(f"Coroutine Started : {x}")
    y = yield x
    print(f"Coroutine Received : {y}")
    z = yield x + y
    print(f"Coroutine Received Again : {z}")
    yield x + y + z

from inspect import getgeneratorstate
cr2 = cor2(10)

# 코루틴 상태 확인 (1)
print(getgeneratorstate(cr2))
print(next(cr2))

# 코루틴 상태 확인 (2)
print(getgeneratorstate(cr2))
print(cr2.send(100))

# 코루틴 상태 확인 (3)
print(getgeneratorstate(cr2))
print(cr2.send(1000))

 

위와 같이 예제를 구성하여 코루틴의 상태를 확인할 수 있다

총 3번의 yield를 사용하여 x / x + y / x + y + z의 값을 반환한다

또 코루틴을 호출하는 시점에서 getgeneratorstate 함수를 호출하여 해당 코루틴의 상태도 확인한다

 

실행 결과

 

실행 결과는 위와 같다

최초 대기 상태에서는 GEN_CREATED가 출력되고,

yield를 대기하는 상태에서는 GEN_SUSPENDED가 출력된다

 

2) 중첩 yield

def cor3():
    for x in "AB":
        yield x
    for y in range(1, 4):
        yield y

cr3 = cor3()
print(next(cr3))
print(next(cr3))
print(next(cr3))
print(next(cr3))
print(next(cr3))

cr4 = cor3()
print(list(cr4))

print()
print()

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

cr5 = cor4()
print(next(cr5))
print(next(cr5))
print(next(cr5))
print(next(cr5))
print(next(cr5))

 

yield를 사용하여 코루틴 외부로 값을 한번씩만 전달할 수 있다

그러나 파이썬 3.3에서 도입된 yield from 구문을 사용하면

하위 제너레이터반복 가능한 객체의 모든 값을 한번에 전달할 수 있다

 

실행 결과

 

실행 결과는 위와 같다

반복하여 yield 구문을 실행한 결과와 yield from 구문을 실행한 결과는 동일하다

728x90
반응형

'Python > 파이썬 심화' 카테고리의 다른 글

Futures 모듈 (1)  (0) 2025.10.19
Futures 모듈이란?  (0) 2025.10.19
코루틴 (1)  (0) 2025.10.12
제너레이터 + itertools 모듈  (0) 2025.09.28
병행성 - 기본 (2)  (0) 2025.09.14