Coroutine

Nam Eun-Ji·2020년 11월 16일
0

python-비동기

목록 보기
3/4
post-custom-banner

루틴

루틴은 컴퓨터 프로그램에서 하나의 정리된 일이다. 프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 성립된다.

  • 메인루틴
    메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어진다.

  • 서브루틴
    서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것이다. 서브루틴은 별도의 메모리에 해당 기능을 모아 놓고 있어, 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return을 통해 원래 호출자의 위치로 돌아오게된다. 서브루틴을 함수와 비슷한 개념이라고 생각하면 된다.


예제
아래 코드에서 calc이 메인루틴이고, add는 calc의 서브루틴이다.

def add(a, b):
    c = a + b    # add 함수가 끝나면 변수와 계산식은 사라짐
    print(c)
    print('add 함수')
 
def calc():
    add(1, 2)    # add 함수가 끝나면 다시 calc 함수로 돌아옴
    print('calc 함수')
 
calc()  

메인 루틴에서 서브 루틴을 호출하면 서브 루틴의 코드를 실행한 뒤 다시 메인 루틴으로 돌아온다. 특히 서브 루틴이 끝나면 서브 루틴의 내용은 모두 사라진다. 즉, 서브 루틴은 메인 루틴에 종속된 관계이다.



비선점형, 선점형

  • 비선점형 멀티태스킹 Non-preemptive Multitasking
    하나의 Task가 스케쥴러로부터 CPU사용권을 할당받았을 때, 스케쥴러가 강제로 CPU사용권을 뺏을 수 없을 경우

  • 선점형 멀티태스킹 preemptive Multitasking
    하나의 Task가 스케쥴러로부터 CPU사용권을 할당받았을 때, 스케쥴러가 강제로 CPU사용권을 뺏을 수 있을 경우



Coroutine 코루틴

= 동시 실행 루틴

루틴의 일종이지만 메인-서브의 개념이 없고 모든 루틴들이 서로를 호출할 수 있다
코루틴은 진입점이 여러개인 함수이다.

코루틴은 함수가 종료되지 않은 상태에서 메인 루틴의 코드를 실행한 뒤 다시 돌아와서 코루틴의 코드를 실행한다. 코루틴이 종료되지 않았으므로 코루틴의 내용도 계속 유지된다.

서브루틴의 경우에는 메인루틴에서 특정 서브루틴의 공간으로 이동한 후에 return에 의해 호출자로 돌아와 다시 프로세스를 진행하는데 반해, 코루틴의 경우에는 루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시 원래 위치로 돌아와 나머지 루틴을 수행할 수 있다.

서브루틴은 진입점과 반환점이 단 하나밖에 없어 메인루틴에 종속적이지만, 코루틴은 진입지점이 여러개이기 때문에 메인루틴에 종속적이지 않아 대등하게 데이터를 주고 받을 수 있다는 특징이 있다.


비선점형 멀티태스킹
코루틴은 병행성(Concurrency)을 제공하지만 병렬성(Parallelism)은 제공하지 않는다.

여기서 병행성, 병렬성이란?

  • 병행성 : 동시에 실행되는 것처럼 보이는 것
  • 병렬성 : 실제로 동시에 작업이 처리되는 것

참고 : https://blog.naver.com/namji117/222010369327


코루틴 vs 쓰레드
코루틴 : 비선점형 멀티태스킹
쓰레드 : 선점형 멀티태스킹

  1. 코루틴간의 작업 교환 때 비용이 적다는 것이다.
    쓰레드간 작업 교환은 system call 또는 blocking call 콜 등의 비용이 발생한다.
  2. 동기화 작업을 위한 mutexes, semaphores 등의 장치가 필요없다.
  3. OS의 지원도 필요가 없다

예제 코드

  • yield값만 리턴하는 경우
def test(i):
    while True:
        yield i
        i -= 1
        if i == 0:
            break

a = test(5)
print(next(a))  # 5
print(next(a))  # 4
print(next(a))  # 3
print(next(a))  # 2
print(next(a))  # 1
print(next(a))  # StopIteration
  • 코루틴과 메인루틴이 서로 통신하는 형태
def test(i):
    while True:
        value = yield i
        print('check : ', value, i)
        i += value
        print('check : ', value, i)

a = test(5)
print(next(a))  # 5, yield i 부분에서 멈춰있다.

print(a.send(3))   # yield를 통해 3이 전달하여 value가 3이 되고, i+=value줄을 거쳐 i=8이되고 한바퀴 돌아 8을 출력, yield에서 멈춘다.
# check : 3 5
# check : 3 8
# 8

print(a.send(1))
# check : 1 5
# check : 1 8
# 9



출처
https://medium.com/@sunminlee89/코틀린-코루틴-coroutine-기초-1342ae6916ce
https://dojang.io/mod/page/view.php?id=2418
https://wooooooak.github.io/kotlin/2019/08/25/코틀린-코루틴-개념-익히기/

profile
한 줄 소개가 자연스러워지는 그날까지
post-custom-banner

0개의 댓글