브라우저 같은 환경은 다수의 자바스크립트 엔진 인스턴스를 쉽게 내어줄 수 있고 인스턴스마다 개별 스레드를 배정해 실행할수있다. 이러한 프로그램의 독립적인 스레드 조각을 웹 라고 하는데 프로그램을 덩이로 나누어 병렬 실행하는 작업 병행성을 추구한다.
-
자바스크립트 메인프로그램에서 워커를 인스턴스화 하는방법
const w1 = new Worker("js file 위치") ;
파일을 지정하면 브라우저는 이 파일을 별도의 스레드에서 독립적으로 실행한다.
-
워커는 같은 워커끼리, 심지어 메인프로그램과도 데이터를 공유하지 않는다.
-
워커 객체 w1은 이벤트 리스터 + 트리거로 워커가 보낸 이벤트를 구독하고 워커에 이벤트를 보낸다.
// 리스닝 코드 w1.addEventListener("메세지",()=>{ // 콜백 }) ; // 메세지 이벤트 코드 전달 코드 w1.postMessage("sfasfas");
워커 내부에서는 메인코드나 Dom 객체에 접근하는 것이 불가능하다. 대신에 navigator,location,ajax와 같은 중요한 전역 변수/특성 자체를 복사하여 접근할 수 있다.
-
외부 js 코드를 읽어드리기
//워커 내부에서 importScript("~.js");
-
웹 워커의 주요 용도
- 처리 집약적 수학 계산
- 대용량 데이터 세트 정렬
- 데이터 작업
- 트래픽 높은 네트워크 통신
위의 4가지 용도에는 주요 공통점이 있는데 이벤트 체계를 바탕으로 스레드간 장벽을 넘어 대량의 데이터가 양방향 전성이 되어야 하는 요건이다.
두 가지 방법이 있다.
-
구조화된 복제 알고리즘
알고리즘을 사용하여 객체를 복사/복제 하는 방법이다.
-
트랜스퍼러블 객체
데이터 자체는 그대로 두고 객체의 소유권만 전달하는 방법이다.
구조화된 복제 알고리즘 보단 트랜스퍼러블 객체가 성능이 더 좋다.
네트워크 제약이 필요한 상황에서 웹의 사이트와 웹의 페이지 인스턴스를 공유할 수 있는 중앙 워커를 사용하면 도움이 되는데 SharedWorker 를 사용하여 생성을 할 수 있다.
공유 워커는 전용 워커와 기능과 의도는 같지만 다수의 인스턴스와 연결이 가능하기에 포트라는 고유의 식별자가 있어 이부분을 설정 해주는 것 말고는 차이가 없다.
- 포트접속이 끊겨도 다른 포트 접속이 살아있다면 공유 포트는 유지된다.
웹 워커를 사용할 땐 실행 환경이 비호환 구형 브라우저인 경우를 감안 해야한다.
구형 브라우저에서는 웹 워커가 돌아가지 않는다. 저자의 말에 따르면 폴리필을 찾으려면 찾을 수 는 있지만 별로 좋아 보이진 않는다고 한다.
SIMD 는 데이터 병행성을 나타내는 형식으로 웹 워커의 작업 병행성과는 대조되는 개념이다.
SIMD의 관심사는 여러데이터 비트를 병렬로 처리하는 일이다.
SIMD는 스레드를 지원하지 않고 현대 CPU가 숫자 벡터와 모든숫자에 병렬 연산이 가능한 명령어 세트를 지원하는 데 이것을 이용한다.
asm.js 는 자바스크립트 언어에서 고도로 최적화 가능한 부분 집합을 말한다.
최적화 하기 어려운 , 특정한 체계와 패턴을 방지한 asm.js식 코드는 자바스크립트 엔진이 인식하여 아주 공격적으로 저수준 최적화를 하는 등의 특별히 조치한다.
최적화 방법의 코드 가독성 같은 부분은 좋지 않은 것 같다.