안드로이드/정리

[Android] Coroutine에 관해...

루틴

  • 컴퓨터 프로그램에서 하나의 정리된 일(작업을 정의한 명령어 집합)
  • 프로그램은 보통 크고 작은 여러가지 루틴을 조합시켜 성립
  • 루틴은 메인루틴과 서브루틴으로 나뉨

메인루틴

  • 프로그램 전체의 개괄적인 동작 절차 표시하도록 만드는 핵심 역할

서브루틴

  • 반복되는 특정 기능을 모아 별도로 묶어 이름을 붙이고 사용하는 하위 루틴
  • 서브루틴은 별도의 메모리에 해당 기능을 모아 놓고 있어, 서브루틴이 호출될 때마다 저장된 메모리로 이동했다가 return 을 통해 원래 호출자의 위치로 돌아옴
  • 함수와 비슷한 개념

서브루틴과 코루틴

코루틴도 루틴의 일종이다.

 

서부루틴과 코루틴의 차이점

코루틴에선 메인-서브 개념이 없어 모든 루틴들이 서로 호출할 수 있음

 

메인 루틴에서 특정 서브루틴의 공간으로 이동 후 return에 의해 호출자로 돌아와 다시 프로세스를 진행하는 서브루틴

코루틴은 루틴을 진행하는 중간에 멈춰 특정 위치로 돌아갔다가 다시 원래 위치로 돌아와 나머지 루틴을 수행할 수 있음

 

서브루틴은 진입점과 반환점이 단 하나밖에 없어 메인루틴에 종속적

코루틴은 진입지점이 여러개라 메인루틴에 종속적이지 않아 대등하게 데이터를 주고 받음

 

코루틴(Coroutine)

  • Entry Point 여러 개 허용하는 서브루틴이다.
  • 언제든 일시 정지하고 다시 실행이 가능하다.
  • event loops, itertors, 무한리스트, 파이프 같은 것을 구현하는 데 적합하다.

blocking

호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 호출한 함수에게 바로 돌려주지 않음

호출한 함수는 호출된 함수가 return 되기를 기다리는 동안 다른 일을 못함

Thread 관점으로 보면, 요청한 작업을 마칠 때까지 계속 대기하며 return 값을 받을 때까지 한 Thread를 계속 사용/대기

 

non-blocking

호출된 함수가 자신이 할 일을 채 마치지 않아도 제어권을 돌려줘(return) 호출된 함수가 다른 일을 진행할 수 있도록 함

호출된 함수는 할 일을 다 마치고서 callback 호출

Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO 처리 가능

 

Basics

코루틴을 생성하기 위한 코루틴 빌더

GlobalScope : 프로그램 전반에 걸쳐 백그라운드 에서 동작하는 코루틴 ( 별로 사용하지 않음 )

CoroutineScopre : 코루틴의 범위. 코루틴 블록을 묶음으로 제어할 수 있는 단위

 

Coroutine Context

[ Coroution Scope ( 여기가 Context ) . ??? ]

코루틴을 실행하기 위한 다양한 설정정보갑승ㄹ 가진 객체

코루틴 컨텍스트는 + 연산을 통해 조합할 수 있다.

val someContext = Dispatcher.IO + aJob + bCoroutine + cExceptionHandler

 

코루틴의 Thread 지정

코루틴을 생성해 launch()할 때 어떤 Thread에서 돚악하게 할 지 설정 가능.

  • Dispatchers.Main : 안드로이드 메인 쓰레드
  • Dispatchers.IO : Disk or network 작업할 때
  • Dispatchers.Default : 그 이외의 CPU 처리가 필요한 작업
  • withContext : async와 동일한 역할로 await 없이 결과가 리턴될 때까지 기다렸다가 결과 받음