22. Coroutines

코루틴은 제너레이터와 몇가지를 제외하고는 거의 비슷합니다. 주된 다른점은,

  • 제너레이터는 데이터의 생산자이고,
  • 코루틴은 데이터의 소비자입니다.

먼저 제너레이터 만드는 과정을 돌이켜봅시다. 아래와 같이 제너레이터를 만들 수 있습니다.

def fib():
    a, b = 0, 1
    while True:
        yield a, b = b, a + b

그 이후에 for 루프는 아래와 같이 사용합니다.

for i in fib():
    print(i)

리스트에 값을 저장하는 게 아니라 생산하고 날려버리기 때문에 빠른데다 메모리에 부하를 주지도 않습니다. 우리가 위 예시에 yield를 사용하면 일반적으로 코루틴이 됩니다. 코루틴은 보내는 값들을 사용합니다. 아주 기본적인 예시인 grep을 사용하는 방법을 알아보겠습니다.

def grep(pattern):
    print ("Searching for %s" % pattern)
    while True:
        line = (yield)
        if pattern in line:
            print(line)

잠깐! yield의 반환값은 무엇일까요?? 코루틴으로 반환값을 넣었습니다. 값을 처음부터 포함시킬 수 없고, 외부에서 값(value)을 포함시켜야합니다. .send() 메소드를 사용해서 값을 포함시킵니다.
예제를 보겠습니다.

search = grep('코루틴')
next(search)
# Output: Searching for coroutine
search.send("너를 사랑해")
search.send("너는 나를 사랑하지않니?")
search.send("그럼 나는 코루틴을 사랑할테야!")
# Output: 그럼 나는 코루틴을 사랑할테야!

보내진 값들은 yield가 접근합니다. 코루틴으로 시작하기 위해서는 next()를 꼭 실행주어야합니다. 제너레이터와 동일하게, 코루틴도 함수를 바로 시작할 수는 없습니다. 대신 응답에서 __next__()send() 메소드를 사용해서 실행합니다. 그러므로, yield문에서 실행될 수 있도록 next()를 실행 해 주어야합니다.

.close() 메소드를 사용해서 코루틴을 닫을 수도 있습니다.

search = grep('coroutine')
#...
search.close()

이외에도 코루틴에 대한 정보는 많습니다. David Beazley의 멋진 자료를 보시기를 추천합니다.

results matching ""

    No results matching ""