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)이 필요합니다. 하지만, 코루틴은 시분할 방식 멀티태스킹이라 동기화를 위한 락이 필요하지 않습니다.