CHAPTER 15 타임라인 격리하기
타임라인 다이어그램은 시간에 따라 어떤 일이 일어나는지 보여줍니다
두 가지 타임라인 다이어그램 기본 규칙
- 두 액션이 순서대로 나타나면 같은 타임라인에 넣는다
- 두 액션이 동시에 실행되거나 순서를 예상할 수 없다면 분리된 타임라인에 넣는다
- 액션은 순서대로 실행되거나 동시에 실행된다
- 순서대로 실행되는 액션은 같은 타임라인에서 하나가 끝나면 다른 하나가 실행된다
- 동시에 실행되는 액션은 여러 타임라인에 나란히 실행된다
자세히 보면 놓칠 수 있는 액션 순서에 관한 두 가지 사실
- ++와 +=는 사실 세 단계다
- 이 연산자에는 세 단계로 연산을 한다는 사실이 숨어 있다
- 인자는 함수를 부르기 전에 실행한다
- 함수에 인자를 실행하면 인자는 함수에 전달되기 전에 실행된다
서로 다른 언어, 서로 다른 스레드 모델
- 단일 스레드, 동기
- PHP 는 기본적으로 멀티스레드를 사용할 수 없습니다
- 단일 스레드, 비동기
- 멀티스레드
- 메시지 패싱(messaging passing) 프로세스
타임라인 다이어그램으로 순서대로 실행되는 코드에도 두 가지 종류가 있다는 것을 알 수 있습니다
- 순서가 섞일 수 있는 코드
- 순서가 섞이지 않는 코드
타임라인 다이어그램으로 동시에 실행되는 코드는 순서를 예측할 수 없다는 것을 알 수 있습니다
- 여러 개의 타임라인은 시간에 따라 다양한 방식으로 실행 될 수 있다
- 타임라인이 실행 가능한 방법을 가능한 순서(possible order)라고 한다
- 타임라인이 하나면 실행 가능한 순서는 하나다
좋은 타임라인의 원칙
- 타임라인은 적을수록 이해하기 쉽다
- 타임라인은 짧을수록 이해하기 쉽다
- 공유하는 자원이 적을수록 이해하기 쉽다
- 자원을 공유한다면 서로 조율해야 한다
- 시간을 일급으로 다룬다
자바스크립트의 비동기 큐
- 자바 스크립트는 작업 큐(job queue)라고 하는 큐를 가지고 있다
- 이벤트 루프에 의해 처리된다
작업이란 무엇인가?
- 작업 큐에 있는 작업은 이벤트 데이터와 이벤트를 처리할 콜백으로 구성되어 있다
- 이벤트 루프는 이벤트 데이터를 인자로 콜백을 부른다
- 콜백은 이벤트 루프가 실행할 함수
- 이벤트 루프는 단순히 첫번째 인자에 이벤트 데이터를 넣어 콜백함수를 수행한다
작업은 큐에 어떻게 들어가나요?
- 이벤트가 발행하면 큐에 작업이 추가된다
- 이벤트는 예측 불가능한(unpredictably) 시점에 작업 큐에 들어간다
작업이 없을 때 엔진은 무엇을 하나?
- 이벤트 루프는 대기 상태로 들어가고 전원을 아낀다
- 가비지 컬렉션 같은 관리 작업을 한다
자원을 공유하는 타임라인은 문제가 생길 수 있습니다
- 공유하는 자원을 없에 문제를 해결할 수 있습니다
- 전역변수를 지역변수로 바꾸기
- 전역변수를 인자로 바꾸기
- 암묵적 인자 확인하기
- 암묵적 입력을 인자로 바꾸기
원칙: 비동기 호출에서 명시적인 출력을 위해 리턴값 대신 콜백을 사용할 수 있습니다
- 동기 함수
- 호출하는 곳에서 리턴값을 사용할 수 있다
- 액션을 빼내기 위해 액션을 부르는 곳은 리턴값으로 바꾸고 액션에 리턴값을 인자로 전달한다
- 비동기 함수
- 미래에 어떤 시점에 콜백을 통해 결과를 받는다
- 액션을 빼내기 위해 액션을 부르는 곳은 콜백으로 바꾸고 액션에 콜백을 인자로 전달한다
참조