Q & A

코루틴 초기화를 자동화할 수 없나요?

코루틴 객체를 생성한 뒤 next를 호출하는 모양이 마음에 들지 않는다면 다음과 같이 코루틴 초기화 데코레이터를 만들어서 사용하면 됩니다. 즉, 데코레이터 안에서 코루틴 객체를 만들고 next를 호출한 뒤 객체를 반환합니다(데코레이터는 Unit 42 데코레이터 사용하기' 참조).

coroutine_decorator.py

def coroutine(func):    # 코루틴 초기화 데코레이터
    def init(*args, **kwargs):
        co = func(*args, **kwargs)    # 코루틴 객체 생성
        next(co)                      # next 호출
        return co                     # 코루틴 객체 반환
    return init
 
@coroutine    # 코루틴 초기화 데코레이터 지정
def sum_coroutine():
        total = 0
        while True:
            x = (yield total)
            total += x
 
co = sum_coroutine()    # 코루틴 객체를 생성한 뒤 바로 사용
 
print(co.send(1))
print(co.send(2))
print(co.send(3))

실행 결과

1
3
6

이터레이터와 제너레이터의 차이는 무엇인가요?

제너레이터는 이터레이터를 반환하는 함수입니다. 따라서 모든 제너레이터 객체는 이터레이터입니다. 그러나, 이터레이터가 항상 제너레이터 객체인 것은 아닙니다.

코루틴의 이점은 무엇인가요?

보통 두 루틴이 동시에 실행되는 멀티태스킹은 하나의 변수에 값을 동시에 쓰면(write) 동기화 문제가 발생합니다. 따라서 크리티컬 섹션, 세마포어, 뮤텍스 등 동기화를 위한 락(lock)이 필요합니다. 하지만, 코루틴은 시분할 방식 멀티태스킹이라 동기화를 위한 락이 필요하지 않습니다.