Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Coroutine #40

Open
SuyeonChoi opened this issue Dec 14, 2022 · 0 comments
Open

Coroutine #40

SuyeonChoi opened this issue Dec 14, 2022 · 0 comments
Labels

Comments

@SuyeonChoi
Copy link
Owner

코루틴(Coroutine)이란?

  • 함께(Co) 수행되는 서로다른 함수(Routine)
  • 스레드 안에서 실행되는 일시 중단 가능한 작업의 단위. 하나의 스레드에 여러 코루틴이 존재 가능
  • 하나의 스레드에서 한 routine이 다른 routine에게 스레드 점유 권한을 양보함으로써 함께 수행
  • 비동기, non blocking 프로그래밍, 동시성, actor에서 활용할 수 있는 기능 제공

스크린샷 2022-12-14 오후 5 07 47

서브루틴과 차이

fun routine1() {
  routine2() // 서브루틴
}

fun routine2() {
  println("루틴 2")
}
  • 함수 안에 함수가 존재하는 경우, 안쪽에 존재하는 함수가 서브 루틴
  • 서브 루틴은 무조건 순차적으로 수행되지만, 코루틴은 함께 수행되며 서로 무제한 양보를 한다. 이를 통해 스레드 자원을 최대한으로 활용 가능하다.

코루틴이 스레드 작업을 최적화하는 방법

스크린샷 2022-12-14 오후 5 27 31

JVM 스레드 구조와 다중 Thread 작업의 필요성
하나의 프로세스에는 여러 스레드가 있고, 각 스레드는 독립적으로 작업을 수행한다.
JVM 프로세스는 메인 스레드가 종료되면 강제로 종료되며, JVM 프로세스에 속한 스레드들도 함께 강제로 종료된다.
하지만 메인 스레드가 아닌 다른 스레드들에서는 메인 스레드와 마찬가지로 작업을 수행할 수 있으나, 이 스레드가 종료되더라도 다른 스레드에는 영향을 미치지 않는다. 따라서 메인 스레드에서 많은 부하를 받는 작업을 지양하고, 다른 스레드를 생성해 높은 부하를 주는 작업을 수행해야한다.

  • 기존 다중 스레드 작업 방식

    • Runnable 인터페이스를 구현한 클래스를 스레드에 넣는 방식
    • ExecuterService를 이용해 Thread Pool을 구성하는 방식
    • Rx 라이브러리(Reactive Programming을 돕기 위한 라이브러리)를 이용하는 방식
  • 기존 작업 방식의 문제점

    • 작업 단위가 스레드인데 스레드를 생성하고 전환하는 비용은 비싸다. 또한, 만약 한 스레드가 다른 스레드의 작업을 기다려야하면(Blocking) 해당 스레드는 기다리는 동안 자원이 낭비되는 셈이다.
  • 코루틴이 기존의 문제점을 해결한 방법

    • 코루틴도 작업 단위가 스레드이지만, 스레드 내부에서 작은 스레드처럼 동작하는 것이 코루틴이다. (첫번째 그림 참고)
    • 스레드 하나를 일시 중단 가능한 다중 경량 스레드처럼 활용
    • 만약 한 스레드가 다른 스레드의 작업이 필요하다면, 해당 스레드를 Blocking 하는 대신 코루틴1 작업을 일시 중단하고 코루틴2에 스레드 리소스 사용 권한을 넘겨준다. (Non Blocking)

스크린샷 2022-12-14 오후 5 40 47


Ref.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant