사전 정의

비동기(Asynchronous) : 작업의 요청과 그 결과가 순차적인 흐름을 따르지 않는 것

  • 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청된다.

동시성(Concurrency) : 여러 작업이 같은 시간에 실행 되어 보이는 상태

  • 흔히 Single Core, Multi-Thread 환경에서 가능
  • Context-Switch 발생
  • 시분할(time-sharing)
  • 동기화 이슈 발생
  • 병행성 이라고도 불림

병렬성(Parallelism) : 여러 작업이 같은 시간에 실제로 여러 개 실행되는 상태

  • 흔히 Multi Core, Multi-Thread 환경에서 가능
  • 동기화 이슈 발생

Thread Blocking : 스레드가 일시 정지된 상태

Kotlin Coroutine 기본

정의

Coroutines are light-weight threads that allow you to write asynchronous non-blocking code.

A coroutine is an instance of a suspendable computation.

=> suspend 와 resume이 가능한 프로그래밍 모듈

쓰임처

sequential code를 통해 asynchronous, non-blocking 프로그래밍을 할때 사용돤다.

1
2
3
4
5
6
7
8
fun showNews() {
  viewModelScope.launch {
      val config = getConfigFromApi()
      val news = getNewsFromApi(config)
      val user = getUserFromApi()
      view.showNews(user, news)
  }
}

대안

callback

1
2
3
4
5
6
fun onCreate() {
    getNewsFromApi { 
        news -> val sortedNews = news.sorted()
        view.showNews(sortedNews)
    }
}
  • callback 함수가 많아지면 가독성이 떨어진다. (callback 지옥)
  • 병렬 처리 매우 어렵다.
  • cancel (취소) 가 어렵다.
  • callback 함수가 많아지면, 작업의 순서를 개발자가 다루기 힘들어진다.

thread

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fun onCreate() {
    thread {
        val news = getNewsFromApi()
        val sortedNews = news.sorted()
      
        runOnUiThread {
          view.showNews(sortedNews)
        }
    }
}
  • 스레드가 실행된 이후 중단이 불가하다.
  • 스레드는 생성 비용이 높다.
  • 스레드를 자주 전환하면 관리하기 어렵고 복잡도가 증가한다.
  • 가독성이 떨어진다.

RxJava와 리액티브 스트림

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
fun onCreate() {
  disposables += getNewsFromApi()
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .map { news ->
          news.sortedByDescending { it.publishedAt }
      }
      .subscribe { sortedNews ->
          view.showNews(sortedNews)
      }
}
  • 메모리 누수도 없고, 취소가 가능, 스레드를 적절히 사용 가능

  • 러닝 커브가 높다.

  • 객체를 반환하는 함수들은 Obseravle or Signle 클래스로 래핑(wrapping) 해야 한다.

  • 구현하기 복잡하다.

    • end-point가 증가 할수록 더욱 복잡해진다.

특징

  • 특정 thread에 종속되지 않는다

    • 하나의 Thread에서 suspend 되었다가 다른 Thread에서 resume 된다.
  • suspend 시 스레드가 blocking 되지 않는다.

    • 대신 코루틴은 잠시 중단된다.
    • 멈춰 있는 동안 해당 스레드는 다른 작업을 할 수 있다.
    • 데이터가 준비되면 코루틴은 스레드를 받아 이전에 멈춘 지점부터 다시 시작한다.
  • 스레드에 비해 light-weighted(경량) 하다.

    • 스레드는 명시적으로 생성 및 유지해야 하고, 메모리 또한 할당 되어야 한다.
  • 비선점형 방식으로 동작

    • 실행 주체가 자신의 실행권을 자발적으로 내려 놓음

Reference