[Python] coroutine 코루틴

hukim·2020년 9월 21일
1

Python

목록 보기
10/12
post-custom-banner

                                                            이미지 출처

우리는 지금까지 위 이미지와 같은 서브 루틴 등의 기능에 익숙합니다. 주로 구현한 함수들은 한번 실행되고 종료되는 함수들이였습니다. Python의 서브 루틴은 이러한 서브 루틴의 사용을 조정하는 메인 함수에 의해 호출됩니다.

coroutine 이란?

코루틴은 각 루틴이 종속적인 관계가 아닌 대등한 관계로서, 서로를 순차적으로 호출하게끔 되어있는 함수입니다.

                                                            이미지 출처

바로 코드를 보면서 코루틴에 대해서 알아보겠습니다.

import time

def coroutine_test():
    greeting = "good "
    while True:
        text = (yield greeting)
        print("text = ",end=""), print(text)
        greeting += text


if __name__ == "__main__":
    cr = coroutine_test()
    print("cr=",end=""), print(cr)

    next(cr)
    time.sleep(2)

    print("send 1")
    print(cr.send("morning"))
    time.sleep(2)

    print("send 2")
    print(cr.send("afternoon"))
    time.sleep(2)

    print("send 3") 
    print(cr.send("evening"))
    time.sleep(2)

메인(__main__)에서 next(cr)을 호출하면 coroutine_test함수에 있는 while문 다음 text = (yield greeting) 에서 대기하게 됩니다.

그리고 2초씩 텀을 가지면서 cr.send로 morning, afternoon, evening을 보냅니다.

cr.send("morning")를 보내면 text 변수에 morning이라는 값을 저장합니다.
yield 다음에 위치한 변수는 코루틴 외부로 전달하는 값입니다.
while문 다음에 받은 morning이라는 문자열을 더해서 good morning을 외부로 전달합니다.

단, 코루틴 특성상 여러분 호출될 때 현재 상태를 유지하는 특성때문에 두번째 부터는 good morning에 다음 텍스트들이 더해져서 출력됩니다.
두번째는 good morningafternoon 세번째는 good morningafternoonevening.

그렇다면, 위의 코드에서 send할 때마다 텍스트가 겹치지않고 값이 good morning, good afternoon, good evening으로 출력하게끔 수정해 보겠습니다.

import time

def coroutine_test():
    greeting = "good "
    text = (yield greeting)
    while True:
        print("text = ",end=""), print(text)
        text = yield greeting + text


if __name__ == "__main__":
    cr = coroutine_test()
    print("cr=",end=""), print(cr)

    next(cr)
    time.sleep(2)

    print("send 1")
    print(cr.send("morning"))
    time.sleep(2)

    print("send 2")
    print(cr.send("afternoon"))
    time.sleep(2)

    print("send 3") 
    print(cr.send("evening"))
    time.sleep(2)

처음 next() 호출을 하게 되면 yield에서 대기하고 있다가 send("morning") 으로 값을 전달하면 text에 할당합니다.
그리고 greeting('good') + text('morning')을 전달한 후 다시 대기합니다.

실제로 코드를 편집기에 옮겨서 디버깅 해보면 좀 더 보기쉽게 위 과정들을 확인할 수 있습니다.

post-custom-banner

0개의 댓글