7/14 수업

hyunji·2023년 7월 14일

코루틴 인 액션

어떻게 코어를 효율적이고 효과적으로 사용?

  • 컨텍스트 스위칭이 최대한 안일어나는 방향으로 개발
  • 적절한 스케줄링 사용

프로세스

  • 실행중인 애플리케이션의 인스턴스. 상태 갖고 있음
  • 애플리케이션은 몇개의 프로세스를 갖을 수 있나?
    - 일반적으로 애플리케이션 당 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

0개의 댓글