코드스피츠73 part5
BLOCK, NONBLOCK
FLOW IS BLOCKING
프로그램이 실행되면 도중에 멈춰지지 않고 끝까지 실행됨
1 2 3 4 5 6 7 8 9 10 11
| for(const i of (function*(){ let i = 0; while(true) yield i++; })()) console.log(i);
|
BLOCKING FUNCTION
점유하는 시간 만큼 블록을 일으키는 함수
1 2 3 4 5 6 7 8 9 10
| const f = v->{ let i=0; while(i++ < v); return i; };
f(10); f(10000000000000);
|
- 배열순회, 정렬-배열크기에따라
- DOM순회-DOM의하위구조에따라
- 이미지프로세싱-이미지크기에따라
BLOCKING EVASION
독점적인 cpu 점유로 인해 모든 동작이 정지됨
타임아웃체크에 의해 프로그램이 강제 중단됨
블록킹의 조합을 예측할 수 없음
1 2 3 4
| const f = v->other(some(v), v * 2); f(10);
|
칸텍스트 스위칭 - 시분황 운영체제의 동시 실행
하나의 프로세스에 여러 쓰레드를 사용해서 동시 실행한다.
time slicing
1 2 3 4 5 6 7 8 9 10
| const looper =(n, f)=>{ for(let i = 0; i < n; i++) f(i); };
looper(10, console.log); looper(10000, console.log);
|
time slicing manual
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const looper =(n, f, slice = 3)=>{ let limit = 0, i = 0; const runner=_=>{ while(i < n){ if(limit++ < slice) f(i++); else{ limit = 0; requestAnimationFrame(runner); break; } } }; requestAnimationFrame(runner); };
looper(12, console.log);
|
시간 기준으로 자동화 시킴
time slicing auto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const looper =(n, f, ms = 5000, i = 0)=>{ let old = performance.now(), curr; const runner=_=>{ while(i < n){ curr = performance.now(); if(curr -old < ms) f(i++); else{ old = curr; requestAnimationFrame(runner); break; } } }; requestAnimationFrame(runner); };
|
worker thread pattern
web worker
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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); };
backRun(v=>v[0] + v[1], console.log, 3, 5);
|
1시간 6분 까지 들음
진짜 명강의 ㅜㅜ
참조