코루틴

2023. 2. 12. 19:01카테고리 없음

코루틴은 스레드보다 더 낮은 오버헤드로 비동기 작업을 수행하는데 사용된다.

 

협력형 멀티 태스킹인데  쓰레드를 여러개 쓰는 것이 아니라 쓰레드 한개로 동시성 프로그래밍을 지원하는 것이다.

멀티 태스킹의 일종의 시분할 방식으로 여러 task가 하나의 CPU를 나눠쓰는 방식인데 운영체제의 개입 없이 각 task가 독점적으로 CPU를 사용하고 사용이 끝나면 자발적으로 양보하는 방식입니다.
락이 필요 없다

 

옵저버 패턴이랑 비슷하지만서도 다른 점은 , 쓰레드 하나로 동시성 프로그래밍을 한다.

(비슷한 부분, 어싱크, 논블라킹)

 

이것이 가능한 이유!!

 

그전에 보통 우리가 사용하는 코드 실행 방식을 얘기하자면 !

main 스레드가 plusOne()이라는 메소드를 호출하면 main routine에서 벚어나 Sub routine에 있는 

코드를 순차적으로 처리하고 return 과 함께 다시 원레 main routine으로 돌아와서 나머지 코드를 처리 할수있다.

 

즉 루틴에 진입하는 지점은 해당 메서드가 호출될시 , 그리고 빠져나오는시점은 해당 메서드 작업이 끝난이후에

루틴이 빠져나온다.

 

 

이것을 코루틴은  진입 할 수 있는 진입점도 여러개이고, 함수를 빠져 나갈 수 있는 탈출점도 여러개다.

 

즉 ! 코루틴 함수는 꼭 return문을 만나거나  마지막 닫는 괄호를 만나지 않아도 언제든지 중간에 나가고 

언제든지 들어갈수있다.

 

  1. 쓰레드의 Main함수가 drawPerson()을 호출하면 startCoroutine블럭을 만나 코루틴이 된다(정확하게는 하나의 코루틴을 만들어 시작한다). 위에도 말했듯이 이제 drawPerson()은 진입점과 탈출점이 여러개가 되는 자격이 주어진 것이다.
  2. 코루틴이 실행이 되었지만, suspend를 만나기 전까지는 그다지 특별한 힘이 없다. suspend로 정의된 함수가 없다면 그냥 마지막 괄호를 만날 때 까지 계속 실행된다. 그러나 drawHead()는 suspend 키워드로 정의되어진 함수다. 따라서 drawHead() 부분에서 더 이상 아래 코드를 실행하지 않고 drawPerson()이라는 코루틴 함수를 (잠시)탈출한다.
  3. 메인 쓰레드가 해당 코루틴을 탈출했다. 그렇다고 쓰레드가 놀고 있을리는 없다. 우리가 짜 놓은 다른 코드들을 실행할 수도 있고, 안드로이드라면 UI 애니메이션을 처리 할 수도 있다. 그러나 Head는 어디선가 계속 그려지고 있다. drawHead()는 2초가 걸리는 suspend 함수였음을 기억해보자. drawHead()라는 suspend를 만나 코루틴을 탈출했지만, drawHead() 함수의 기능은 메인쓰레드에서 동시성 프로그래밍으로 작동하고 있을수도 있고, 다른 쓰레드에서 돌아가고 있을 수도 있다. 그것은 개발자가 자유롭게 선택할 수 있다(이해가 되지 않아도 좋다. 바로 뒤에서 다시 설명한다).
  4. 그렇게 메인쓰레드가 다른 코드들을 실행하다가도, drawHead()가 제 역할을 다 끝내면 다시 아까 탈출했던 코루틴 drawPerson()으로 돌아온다. 아까 멈추어놓았던 drawHead() 아래인 drawBody()부터 재개(resume)된다.

위의 과정에서 보았듯이 코루틴 함수는 언제든지 나왔다가 다시 들어올 수 있다. 이 대목에서 이미 눈치를 챈 분들도 있을것 같은데, 코루틴의 이런 성향은 동시성 프로그래밍과 밀접한 관계가 있다.

 

 

-> 논 블라킹, 어싱크로너스 한 프로그래밍 기법은 , 고수준의 프로그래밍이라 일반적으로 사용하기 어렵다.

하지만 이런 코루틴 을 사용하면 좀더 쉽게 편리하게 동시성 프로그래밍을 구현 할수 있다.