루틴은 컴퓨터 프로그램에서 하나의 정리된 일이다. 프로그램은 보통 크고 작은 여러가지 루틴을 조합시킴으로써 성립된다.
메인루틴
메인루틴은 프로그램 전체의 개괄적인 동작 절차를 표시하도록 만들어진다.
서브루틴
서브루틴은 반복되는 특정 기능을 모아 별도로 묶어 놓아 이름을 붙여 놓은 것이다. 서브루틴은 별도의 메모리에 해당 기능을 모아 놓고 있어, 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 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사용권을 뺏을 수 있을 경우
= 동시 실행 루틴
루틴의 일종이지만 메인-서브의 개념이 없고 모든 루틴들이 서로를 호출할 수 있다
코루틴은 진입점이 여러개인 함수이다.
코루틴은 함수가 종료되지 않은 상태에서 메인 루틴의 코드를 실행한 뒤 다시 돌아와서 코루틴의 코드를 실행한다. 코루틴이 종료되지 않았으므로 코루틴의 내용도 계속 유지된다.
서브루틴의 경우에는 메인루틴에서 특정 서브루틴의 공간으로 이동한 후에 return에 의해
호출자로 돌아와 다시 프로세스를 진행하는데 반해, 코루틴의 경우에는 루틴을 진행하는 중간에 멈추어서 특정 위치로 돌아갔다가 다시 원래 위치로 돌아와
나머지 루틴을 수행할 수 있다.
서브루틴은 진입점과 반환점이 단 하나밖에 없어 메인루틴에 종속적이지만, 코루틴은 진입지점이 여러개이기 때문에 메인루틴에 종속적이지 않아 대등하게 데이터를 주고 받을 수 있다
는 특징이 있다.
비선점형 멀티태스킹
코루틴은 병행성(Concurrency)을 제공하지만 병렬성(Parallelism)은 제공하지 않는다.
여기서 병행성, 병렬성이란?
참고 : https://blog.naver.com/namji117/222010369327
코루틴 vs 쓰레드
코루틴 : 비선점형 멀티태스킹
쓰레드 : 선점형 멀티태스킹
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/코틀린-코루틴-개념-익히기/