스레드(Thread) : 프로그램이 동작할 때, CPU 또는 프로세서를 사용하는 단위
싱글 스레드(Single Thread) : 스레드 하나를 사용하는 것이며, 동시에 하나의 작업만 처리할 수 있다.
멀티 스레드(Multi Thread): 여러가지 스레드를 동시에 사용하는 것이며, 동시에 여러가지 작업을 처리할 수 있다.
동기(Sync) : 먼저 실행된 코드의 결과가 나올때까지 대기하는 것
비동기(Async) : 실행된 순서와 관계 없이 결과가 나오는 것을 말한다.
블로킹 (Blocking) I/O : 프로그램 내부에서 호출하면 호출된 함수가 작업을 마칠 때 까지 대기하는 방식
논블로킹(Non-blocking) I/O : 함수가 실행되는 중에도 다른 작업을 동시에 진행할 수 있는 장점
cpu intensive task 처리 애로사항
제어권을 넘기면 다른 코드도 실행될 수 있으므로, 실행 순서 관계없이 결과가 나오는 것이 가능하다.
제어권을 넘기지 않는다면, 결과가 나올 때까지 대기해야한다.
논 블로킹 + 비동기 = 코드의 실행이 끝나지 않아도 다음 코드를 호출
function first() {
console.log('First');
}
setTimeout(first, 1000); // 1000ms(1초) 뒤에 first 함수를 실행해준다.
console.log('Middle');
console.log('Last');
// Print: Middle
// Last
// First
만약 동기였다면, First -> Middle -> Last 순으로 출력됌
javascript 관점에서 비동기 처리를 도익로 처리할 수 있게 돕는 객체 유형
인자로 resolve, reject 를 주입하며, 실행함수라 불리고, Promise가 만들어질 때 자동으로 실행된다.
두 인자는 executor 라 불리며, 둘 중 하나를 무조건 호출해야한다.
new Promise((resolve, reject) => {})
async function main() {
function printFunc(){
console.log("printFunc가 실행되었습니다")
}
const prom = new Promise(printFunc);
}
main()
Promise 는 반드시 3가지 상태를 지닌다.
대기 (Pending) 상태가 아니라면, 연상이 이미 끝난 상태이다.
Javascript 는 대부분 객체(Object)로 구성되어 있다.
객체를 생성하는 함수를 생성자 함수라고 부른다.
Promise 또한 객체로 구성돼 생성자 함수를 이용해 Promise를 선언하게 된다.
비동기함수는 일반함수나 화살표 함수와 비슷하지만 딱 두가지만 다르다.
// 비동기 + 일반 함수
async function 함수이름() {
// 명령문
}
// 비동기 + 익명 함수
async function() {
// 명령문
}
// 비동기 + 화살표 함수
async () => {
// 명령문
}
function 함수이름() {
return Promise.resolve('값');
}
// 위와 아래의 함수는 같은 동작을 보여준다.
async function 함수이름2() {
return '값';
}
함수이름();
// Print: Promise { '값' }
함수이름2();
// Print: Promise { '값' }
await 연산자를 사용하면 Promise 가 이행(fulfil) 상태 거나 거부(rejected) 될 때 까지 함수 실행을 중단 하고 기다릴 수 있다. Promise 연상이 끝나면 반환한 값을 얻을 수 있다.
const result = await 값;
async function 함수이름() {
const result = await 'Test!';
console.log(result);
}
함수이름();
// Print: 'Test!';
"값" 에는 Promise 가 아닌 값도 들어갈 수 있다. 단, Promise가 아니라면, 기다리지 않고 해당 값 자체를 그대로 반환한다.
function setTimeoutFunc(time){
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("에 해당하는 시간이 지났습니다.")
resolve();
}, time);
})
}
async function main(){
console.log("시작 되었습니다.");
await setTimeoutFunc(1000);
console.log("종료 되었습니다.");
}
결과값
시작되었습니다.
1000에 해당하는 시간이 지났습니다.
종료되었습니다.
밑에 비동기 함수 안 await 함수에서 함수실행을 중단하고, 기다린다. 1초뒤 "종료되었습니다" 가 출려되며, 순차적으로 나오는 모습을 볼 수 있다.
싱글스레드의 약점을 보안하기 위해 효율적으로 작업을 처리할 수 있는 특성
Node.js 는 논 블로킹 I/O, 싱글스레드, 이벤트 루프 의 특성이 있다.
Non-blocking , Single Thread, Event Loop
Read : 읽어 메모리에 저장
Evaluate : 평가 된 값
Print : 출력
Loop : 특정 신호 입력 받기 전까지 위 과정 반복
개발자 도구에서 console.log 로 출력 되는 것과 비슷