Generator와 Coroutine

백승진·2020년 10월 28일

1. Generator

  • Generator는 iterator를 생성해주는 함수로 함수안에 "yield"문을 통한 값 리턴부분이 있으면 python은 Generator로 인식한다. 아래 코드를 보자.
      def getNumberGenerator(maxnumber):
          for number in range(maxnumber):
              yield number		# yield 가 사용되므로 이 함수는 Generator이다.

      c = getNumberGenerator(5)
      print(next(c))  # 0
      print(next(c))  # 1
      print(next(c))  # 2
      print(next(c))  # 3
      print(next(c))  # 4
  • next(c) 또는 c.__next__() 호출시 getNumberGenerator 에 돌입, yield 에 있는 값이 외부로 제공되고 generator는 대기상태 돌입한다. next함수를 통해 대기상태를 깨우고 다음 값을 가져올 수 있으며 이는 Generator가 StopIterator 상태 전까지 반복 가능하다.

2. Coroutine

  • Coroutine은 Generator의 일종으로 외부로부터 입력을 받을 수 있으며 필요시 입력요청에 대한 응답으로 Caller가 원하는 데이터를 제공해 줄 수 있다. 아래 코드를 보자.
    def getNumberGenerator(maxnumber):
        total = 0
        while True:
            inputValue = (yield total)
            print(f"input_value : {inputValue}")
            total += inputValue

    c = getNumberGenerator(5)

    next(c)				# 0
    print(f"total : {c.send(3)}")	# 3
    print(f"total : {c.send(5)}")	# 8
    print(f"total : {c.send(7)}")	# 15
  • 코루틴의 경우 yield를 ()로 묶어야 한다.
    • 외부로부터 send() argument값을 받고 바로 외부에 제공할 데이터를 기입하면 된다.
      위 코드는 "(yield total)" 에서 입력을 받으며 total 정보를 외부로 제공하게 된다.
    • c.send(3) 과정에서 받는 total 값은 3인 이유는 yield에서 값을 받자마자 total를 제공하는 게 아니라 입력을 받고 하위 로직 처리 후 다음 yield 에 도달하여 대기상태가 될 시점의 total 이기 때문이다. 호출자에 권한을 넘기는 건 다음 대기상태 돌입시기임을 명심하자.
profile
12년 .NET 개발 경력을 가진 웹 초짜 개발자입니다 :)

0개의 댓글