코루틴 인 액션
어떻게 코어를 효율적이고 효과적으로 사용?
- 컨텍스트 스위칭이 최대한 안일어나는 방향으로 개발
- 적절한 스케줄링 사용
프로세스
- 실행중인 애플리케이션의 인스턴스. 상태 갖고 있음
- 애플리케이션은 몇개의 프로세스를 갖을 수 있나?
- 일반적으로 애플리케이션 당 1개
- 여러개 쓰는 케이스 = 크롬 다중창
동시성
- 스레드를 사용하는 이유는 동시성과 병렬성을 사용하기 위해
- 동시성이란 결정론 적인 결과를 갖지만 실행 순서에는 약간의 가변성을 허용하는 코드
- 순서에 관계없이 결과가 결정적이어야 함
- 결과가 결정적? = 코드의 실행 순서가 달라져도 같은 입력에 대해선 같은 결과를 보장함
- 2초 / 1~2초 사이 - 하지만 결과는 똑같
동시성 vs 병렬성
- 왜 2초가 안걸릴까? 코어를 쓰기 때문
- 만약 코어가 하나라면? 시간이 동일하거나 더 오래 걸릴 수 있음. 왜 오래걸리냐? 컨텍스트 스위치때문에.
- 동시성은 보장이 되지만 병렬이 아니다. 병렬적으로 일이 일어난다는 동시성을 보장하지만 동시성으로 일이 일어난다는 것은 병렬적을 보장하지 않다.
라이브 코딩
- 인텔리 제이
- 기본적으로 스레드는 하나만 사용한다.
코루틴
- 실행을 일시 중지할 수 있는 함수
- 기본적으로 스레드 안에 존재하지만 스레드에 얽매이진 않은 가벼운 스레드(=경량스레드)
- 원래는 우리가 함수의 제어권을 갖고 있지 않음. 하지만 코루틴을 사용 시 우리의 의도대로 함수를 일시 중지 할 수 있다.
코루틴 vs 스레드
- 병렬성은 코루틴이 아닌 스레드가 컨트롤한다. 코루틴은 동시성을 컨트롤 한다. 병렬성은 X
- 코루틴은 프레임워크에 의존. 프레임 워크가 컨트롤 함
- 한 코루틴이 내부의 적절한 로직에 의해 여러 스레드에서 수행할 수 있도록 옮겨가도록
코틀린 코루틴
-
코루틴은 운영체제를 타지 않아 빠르고 적은 비용을 생성할 수 있다.
-
코루틴 컨트롤 가능
-
디스패쳐 : 스레드는 한 번에 하나의 코루틴만 실행할 수 있기 때문에 프레임워크가 필요에 따라 코루틴을 스레드들 사이에 옮기는 역할
-
suspend 가 붙은 함수들을 기본적으로 어떤함수다? 이 함수를 계속할 지 일시중지할 지 컨트롤 할 수 있는 함수들이다
-
순차적으로 실행되는 코드임 따라서 2초 걸림
-
Deferred<String> 타입임
-
suspend와 async를 쓰고 2초가 걸리게 하는 법
- dispatcher 이용
Val context: CoroutineDispatcher = newSingleThreadContext(“수달”)
runBlocking(context) {} //context를 인자로 넣어줌
-
await()를 호출해 두 연산에 모두 결과가 나타날 때까지 일시 중단되도록 요청한다.
-
해당 스레드를 블록킹하지 않고 실행을 일시 중지한다.
-
블로킹은 스레드의 실행지 일시 중지가 아니라 중지
-
논 블로킹은 일시 중지
-
중지 VS 일시중지
-
결과 : 값, 오류 리턴 가능
-
launch : 코루틴 무시하고 우선 결과 출력
-
getName, getLastName 결과값을 볼 수 있는 이유는 runBlocking이기 때문
-
만약 runblocking없다면 end가 출력되지 않음
-
async일 때 타입이 Deferred