[Coroutine] 코루틴 기본 개념

업데이트:

동작 방식

  • 애플리케이션은 하나 이상의 프로세스가 있다. 각각은 적어도 하나의 스레드를 갖고 있고 코루틴은 스레드 안에서 실행된다.
  • 코루틴은 재개될 때 마다 다른 스레드에서 실행될 수 있지만 특정 스레드에서만 국한될 수도 있다.

기본형 활용

코틀린은 동시성 코드를 쉽게 구현할 수 있는 고급 함수와 기본형을 제공한다.

  • 스레드는 스레드 이름을 파라미터로 하는 newSingleThreadContext() 를 호출하면 생성된다.
  • 스레드 풀은 크기와 이름을 파라미터로 하는 newFixedThreadPoolContext() 를 호출하면 쉽게 생성할 수 있다.
  • CommonPool 은 CPU 바운드 작업에 최적인 스레드 풀이다.
  • 코루틴을 다른 스레드로 이동시키는 역할은 런타임이 담당한다.

코루틴 기본 용어

  • 채널 : 코루틴 간에 데이터를 안전하게 보내고 받는 데 사용할 수 있는 파이프다.
  • 작업자 풀 : 많은 스레드에서 연산 잡합의 처리를 나눌 수 있는 코루틴의 풀이다.
  • 액터 : 채널과 코루틴을 사용하는 상태를 감싼 래퍼로 여러 스레드에서 샅태를 안전하게 수정하는 메커니즘을 제공한다.
  • 뮤텍스 : 크리티컬 존 영역을 정의해 한 번에 하나의 스레드만 실행할 수 있도록 하는 동기화 메커니즘
  • 스레드 한정 : 코루틴 실행을 제한해서 지정된 스레드에서만 실행하도록 하는 기능
  • 생성자 : 필요에 따라 정보를 생성할 수 있고 새로운 정보가 필요하지 않을 때 일시 중단될 수 있는 데이터 소스다.

일시 중단 연산

일시 중단 연산은 해당 스레드를 차단하지 않고 실행을 일시 중지할수 있는 연산이다.

일시 중단 함수

일시 중단 함수는 함수 형식의 일시 중단 연산이다. suspend 제어자 때문에 쉽게 식별할 수 있다.

suspend fun getAfter(name : String, delayMills : Long) {
  delay(delayMills)
  println("Hello $name")
}

람다 일시 중단

일반적인 람다와 마찬가지로, 일시 중단 람다는 익명의 로컬 함수이다.

코루틴 디스패처

코루틴을 시작하거나 재개할 스레드를 결정하기 위해 코루틴 디스패쳐가 사용된다. 모든 코루틴 디스패처는 CoroutineDispatcher 인터페이스를 구현해야 한다.

코루틴 빌더

일시 중단 람다를 받아 그것을 실행시키는 코루틴을 생성하는 함수다.

  • async() : 결과를 반환하는 코루틴을 시작하는데 사용된다.
  • launch() : 결과를 반환하지 않는 코루틴을 시작한다.
// Async 사용
val result = GlobalScope.async {
  isPalindrome(word = "sample")
}
reult.await()

//Launch 사용
val task = GlobalScope.launch {
  isPalindrome(word = "sample")
}
task.join()

Reference

코틀린 동시성 프로그래밍(에이콘)

댓글남기기