코드스피츠73 part5
BLOCK, NONBLOCK
BLOCKING EVASION -> NONBLOCKING
서브루틴이 즉시플로우 제어권을 내놓는것
const a=123;
looper(12, console.log);
backRun(v=>v[0] + v[1], console.log, 3, 5);
console.log(a); //어쨌든콘솔은123부터출력
SYNC, ASYNC
병행성 프로그래밍에 익숙해져야 된다.
SYNC
서브루틴이 즉시값을 반환함
const double = v=>v*2;
console.log(double(2)); //4
block 즉시 플로우 제어권을 반환하지 않음
const sum = n=>{
let sum = 0;
for(let i = 1; i <= n; i++)
sum += i;
return sum;
};
sum(100);
non block즉시플로우제어권을반환함
const sum = n=>{
const result = {isComplete:false};
requestAnimationFrame(_=>{
let sum = 0;
for(let i = 1; i <= n; i++)
sum += i;
result.isComplete = true;
result.value = sum;
});
return result;
};
const result = sum(100);
while(!result.isComplete); // 무한루프기 때문에 에러남
console.log(result.value);
ASYNC
서브루틴이 콜백을 통해 값을 반환함
const double = (v, f)=> f(v*2);
double(2, console.log); //4
block 즉시 플로우 제어권을 반환하지 않음
const sum = (n, f)=>{
let sum = 0;
for(let i = 1; i <= n; i++)
sum += i;
return f(sum);
};
sum(10, console.log);
console.log(123); //55 → 123
non block즉시플로우제어권을반환함
const sum = (n, f)=>{
requestAnimationFrame(_=>{
let sum = 0;
for(let i = 1; i <= n; i++)
sum += i;
f(sum);
});
};
sum(10, console.log);
console.log(123);//123 → 55
루프를 짤때 블럭가드를 항상 설치한다.
for(let i = 0; i <= arr.length, limit = 50000; limit-- >0 && i<j; i++){
}
if(limit < 0){
}
callback 함수는 리턴 받는 함수를 캡슐화 하기 위해서
SIMILAR ASYNC-BLOCK 미루기 패턴
const sum = (n, f)=>{
requestAnimationFrame(_=>{
let sum = 0;
for(let i = 1; i <= n; i++)
sum += i;
f(sum);
});
};
sum(100000000, console.log);
console.log(123);// 여기서 sync가 발생
const backRun = (f, end, ...arg)=>{
const blob = new Blob([`
onmessage =e=>postMessage((${f})(e.data));
`], {type:'text/javascript'});
const url = URL.createObjectURL(blob);
const worker = new Worker(url);
worker.onmessage =e=>end(e.data);
worker.onerror =e=>end(null);
worker.postMessage(arg);
};
// 사용하는 코드
const f = v=>{
for(let i = 1, sum = 0; i <= v[0]; i++){
sum += i;
}
return sum;
};
let i=1000;
// 쓰레드가 엄청 생김 쓰레드 고갈 10k 문제
while(i--) backRun(f, console.log, 100000);