CHAPTER 15 타임라인 격리하기

CHAPTER 15 타임라인 격리하기

타임라인 다이어그램은 시간에 따라 어떤 일이 일어나는지 보여줍니다

두 가지 타임라인 다이어그램 기본 규칙

  • 두 액션이 순서대로 나타나면 같은 타임라인에 넣는다
  • 두 액션이 동시에 실행되거나 순서를 예상할 수 없다면 분리된 타임라인에 넣는다
    • 액션은 순서대로 실행되거나 동시에 실행된다
    • 순서대로 실행되는 액션은 같은 타임라인에서 하나가 끝나면 다른 하나가 실행된다
    • 동시에 실행되는 액션은 여러 타임라인에 나란히 실행된다

자세히 보면 놓칠 수 있는 액션 순서에 관한 두 가지 사실

  • ++와 +=는 사실 세 단계다
    • 이 연산자에는 세 단계로 연산을 한다는 사실이 숨어 있다
  • 인자는 함수를 부르기 전에 실행한다
    • 함수에 인자를 실행하면 인자는 함수에 전달되기 전에 실행된다

서로 다른 언어, 서로 다른 스레드 모델

  • 단일 스레드, 동기
    • PHP 는 기본적으로 멀티스레드를 사용할 수 없습니다
  • 단일 스레드, 비동기
    • 자바스크립트
  • 멀티스레드
    • 자바, 루비, c, c#, 파이썬
  • 메시지 패싱(messaging passing) 프로세스
    • 엘릭서, 얼랭

타임라인 다이어그램으로 순서대로 실행되는 코드에도 두 가지 종류가 있다는 것을 알 수 있습니다

  • 순서가 섞일 수 있는 코드
  • 순서가 섞이지 않는 코드

타임라인 다이어그램으로 동시에 실행되는 코드는 순서를 예측할 수 없다는 것을 알 수 있습니다

  • 여러 개의 타임라인은 시간에 따라 다양한 방식으로 실행 될 수 있다
  • 타임라인이 실행 가능한 방법을 가능한 순서(possible order)라고 한다
  • 타임라인이 하나면 실행 가능한 순서는 하나다

    좋은 타임라인의 원칙

  • 타임라인은 적을수록 이해하기 쉽다
  • 타임라인은 짧을수록 이해하기 쉽다
  • 공유하는 자원이 적을수록 이해하기 쉽다
  • 자원을 공유한다면 서로 조율해야 한다
  • 시간을 일급으로 다룬다

자바스크립트의 비동기 큐

  • 자바 스크립트는 작업 큐(job queue)라고 하는 큐를 가지고 있다
  • 이벤트 루프에 의해 처리된다

작업이란 무엇인가?

  • 작업 큐에 있는 작업은 이벤트 데이터와 이벤트를 처리할 콜백으로 구성되어 있다
  • 이벤트 루프는 이벤트 데이터를 인자로 콜백을 부른다
  • 콜백은 이벤트 루프가 실행할 함수
  • 이벤트 루프는 단순히 첫번째 인자에 이벤트 데이터를 넣어 콜백함수를 수행한다

작업은 큐에 어떻게 들어가나요?

  • 이벤트가 발행하면 큐에 작업이 추가된다
  • 이벤트는 예측 불가능한(unpredictably) 시점에 작업 큐에 들어간다

작업이 없을 때 엔진은 무엇을 하나?

  • 이벤트 루프는 대기 상태로 들어가고 전원을 아낀다
  • 가비지 컬렉션 같은 관리 작업을 한다

자원을 공유하는 타임라인은 문제가 생길 수 있습니다

  • 공유하는 자원을 없에 문제를 해결할 수 있습니다
  • 전역변수를 지역변수로 바꾸기
  • 전역변수를 인자로 바꾸기
    • 암묵적 인자 확인하기
    • 암묵적 입력을 인자로 바꾸기

원칙: 비동기 호출에서 명시적인 출력을 위해 리턴값 대신 콜백을 사용할 수 있습니다

  • 동기 함수
    • 호출하는 곳에서 리턴값을 사용할 수 있다
    • 액션을 빼내기 위해 액션을 부르는 곳은 리턴값으로 바꾸고 액션에 리턴값을 인자로 전달한다
  • 비동기 함수
    • 미래에 어떤 시점에 콜백을 통해 결과를 받는다
    • 액션을 빼내기 위해 액션을 부르는 곳은 콜백으로 바꾸고 액션에 콜백을 인자로 전달한다

참조