출처는 http://www.dabeaz.com/coroutines/ 입니다.
def coroutine(func): def start(*args, **kwargs): cr = func(*args, **kwargs) cr.next() return cr return start # Example use if __name__ == '__main__': @coroutine def grep(pattern): print "Looking for %s" % pattern while True: line = (yield) if pattern in line: print line, g = grep("python") # Notice how you don't need a next() call here g.send("Yeah, but no, but yeah, but no") g.send("A series of tubes") g.send("python generators rock!")
코루틴을 데코레이터로 선언을 합니다.
이 데코레이터 함수의 역할은 코루틴을 선언할 경우 자동으로 next()를 호출해주는 역할을 합니다.
코루틴의 경우 genertor로 선언을 하고, next()를 호출호출해주어야 준비상태로 들어갑니다.
next()를 호출하는게 필수적이긴 하나 번거로운 일이기 때문에 데코레이터를 써서 처리를 한것이죠
그리고 또 중요한 부분은 ,
yield를 문을 보시면, 뒤에 변수가 없습니다. 이것은 yield를 입력으로 받겠다는 소리입니다.
yield에 변수가 있으면 이것을 출력으로 내보내는데, 위에 구문을 보시면,
yield는 입력으로 받아서 line으로 저장을 하는 것입니다.
g = grep("python")
g.next()
원래는 이랬던 코드가 데코레이터를 사용함으로써
g = grep("python")
이렇게 되었고요,
제네레이터에서 출력을 담당하던 yield 구문이 코루틴에서는 입력을 담당하게 됩니다,
그래서 제네레이터를 producer , 코루틴을 consumer라고 표현을 하는것이죠.